SELECT MIN(key_part2),MAX(key_part2) FROM tbl_name WHERE key_part1=10;
* 对表作排序或分组,当在一个可用的最左前缀索引上做分组或排序时(如 ORDER BY key_part1, key_part2)。如果所有的索引部分都按照 DESC 排序,索引就按倒序排序。详情请看"7.2.9 How MySQL Optimizes ORDER BY"。
* 有些时候,查询可以优化使得无需计算数据就能直接取得结果。当查询使用表中的一个数字型字段,且这个字段是索引的最左部分,则可能从索引树中能很快就取得结果:
SELECT key_part3 FROM tbl_name WHERE key_part1=1
假设有如下 SELECT 语句:
mysql> SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;
SELECT * FROM tbl_name WHERE key_col LIKE '%Patrick%';
SELECT * FROM tbl_name WHERE key_col LIKE other_col;
第一个语句中,LIKE 的参数是以通配符开始的。第二个语句中,LIKE 的参数不是一个常值。 MySQL 4.0及更高会做一个额外的 LIKE 优化。如果使用 ... LIKE '%string%' 并且 string 超过3个字符,MySQL就会用 Turbo Boyer-Moore 算法来初始化模式,并且利用这个模式来加快搜索。用 col_name IS NULL 搜索时也会使用索引,如果字段 col_name 上有索引的话。任何在 WHERE 子句中没有跨越全部 AND 级分句的索引都不会用来优化查询。换言之,想要启用一个索引,那么在任何 AND 分句中都必须使用索引的前缀字段。以下 WHERE 子句使用索引:
... WHERE index_part1=1 AND index_part2=2 AND other_column=3
/* index = 1 OR index = 2 */
... WHERE index=1 OR A=10 AND index=2
/* 优化了 like "index_part1='hello'" */
... WHERE index_part1='hello' AND index_part3=5
/* 使用索引 index1,但没有用到 index2 或 index3 */
... WHERE index1=1 AND index2=2 OR index1=3 AND index3=3;
以下 WHERE 子句不使用索引:
/* 没用到 index_part1 */
... WHERE index_part2=1 AND index_part3=2
/* 所有的 AND 部分没用到索引 */
... WHERE index=1 OR A=10
/* 索引没有跨越全部字段 */
... WHERE index_part1=1 OR index_part2=10
共享访问索引缓存改善了性能,却不能完全消除线程间的冲突。它们仍然争抢控制管理存取索引缓存缓冲的结构。为了更进一步减少索引缓存存取冲突,MySQL 4.1.1提供了多重索引缓存特性。这能将不同的表索引指定到不同的索引缓存。当有多个索引缓存,服务器在处理指定的 MyISAM 表查询时必须知道该使用哪个。默认地,所有的 MyISAM 表索引都缓存在默认的索引缓存中。想要指定到特定的缓存中,可以使用 CACHE INDEX 语句。如下语句所示,指定表的索 t1, t2 和 t3 引缓存到名为 hot_cache 的缓存中:
mysql> CACHE INDEX t1, t2, t3 IN hot_cache;
+---------+--------------------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+---------+--------------------+----------+----------+
| test.t1 | assign_to_keycache | status | OK |
| test.t2 | assign_to_keycache | status | OK |
| test.t3 | assign_to_keycache | status | OK |
+---------+--------------------+----------+----------+
注意,如果服务器编译支持存 ISAM 储引擎了,那么 ISAM 表也使用索引缓存机制。不过,ISAM 表索引只能使用默认的索引缓存而不能自定义。 CACHE INDEX 语句中用到的索引缓存是根据用 SET GLOBAL 语句的参数设定的值或者服务器启动参数指定的值创建的,如下:
mysql> SET GLOBAL keycache1.key_buffer_size=128*1024;
想要删除索引缓存,只需设置它的大小为0:
mysql> SET GLOBAL keycache1.key_buffer_size=0;
索引缓存变量是一个结构体变量,由名字和组件构成。例如 keycache1.key_buffer_size, keycache1 就是缓存名,key_buffer_size 是缓存组件。详情请看"10.4.1 Structured System Variables",它描述了构造索引缓存系统变量的使用语法。默认地,表索引在服务器启动时指定到主(默认的)索引缓存中。当一个索引缓存被删掉后,指定到这个缓存的所有索引都被重新指向到了默认索引缓存中去。对一个繁忙的系统来说,我们建议以下三条策略来使用索引缓存: