关闭

mysql索引

847人阅读 评论(0) 收藏 举报

索引被用来快速找出在一个列上用一特定值的行。没有索引,MySQL不 得不首先以第一条记录开始并然后读完整个表直到它找出相关的行。表越大,花费时间越多。如果表对于查询的列有一个索引,MySQL能快速到达一个位置去搜 寻到数据文件的中间,没有必要考虑所有数据。如果一个表有1000行,这比顺序读取至少快100倍。注意你需要存取几乎所有1000行,它较快的顺序读 取,因为此时我们避免磁盘寻道。

所有的MySQL索引(PRIMARY、UNIQUE和INDEX)在B树中存储。字符串是自动地压缩前缀和结尾空间。见7.27 CREATE INDEX句法。

索引用于:

快速找出匹配一个WHERE子句的行。
|caTzT0V b6?k0Y6?%C0当执行联结时,从其他表检索行。PHPChina 开源社区门户�f2X;qQ?a
对特定的索引列找出MAX()或MIN()值。PHPChina 开源社区门户*p,_8J%xVY6Qb)^
如果排序或分组在一个可用键的最左面前缀上进行(例如,ORDER BY key_part_1,key_part_2),排序或分组一个表。如果所有键值部分跟随DESC,键以倒序被读取。
mn$R,/0q�k-g Q4R0在一些情况中,一个查询能被优化来检索值,不用咨询数据文件。如果对某些表的所有使用的列是数字型的并且构成某些键的最左面前缀,为了更快,值可以从索引树被检索出来。PHPChina 开源社区门户"['nd3@!q%L-Sy
假定你发出下列SELECT语句:

mysql> SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;

如果一个多列索引存在于col1和col2上,适当的行可以直接被取出。如果分开的单行列索引存在于col1和col2上,优化器试图通过决定哪个索引将找到更少的行并来找出更具限制性的索引并且使用该索引取行。

如果表有一个多列索引,任何最左面的索引前缀能被优化器使用以找出行。例如,如果你有一个3行列索引(col1,col2,col3),你已经索引了在(col1)、(col1,col2)和(col1,col2,col3)上的搜索能力。

如果列不构成索引的最左面前缀,MySQL不能使用一个部分的索引。假定你下面显示的SELECT语句:

mysql> SELECT * FROM tbl_name WHERE col1=val1;
/1T.q!vm|/)P0mysql> SELECT * FROM tbl_name WHERE col2=val2;PHPChina 开源社区门户)qe)QV.y{}V!Gd&y
mysql> SELECT * FROM tbl_name WHERE col2=val2 AND col3=val3;

如果一个索引存在于(col1、col2、col3)上,只有上面显示的第一个查询使用索引。第二个和第三个查询确实包含索引的列,但是(col2)和(col2、col3)不是(col1、col2、col3)的最左面前缀。

如果LIKE参数是一个不以一个通配符字符起始的一个常数字符串,MySQL也为LIKE比较使用索引。例如,下列SELECT语句使用索引:

mysql> select * from tbl_name where key_col LIKE “Patrick%”;PHPChina 开源社区门户'J7r2QA_ Z'`V
mysql> select * from tbl_name where key_col LIKE “Pat%_ck%”;

在第一条语句中,只考虑有”Patrick” <= key_col < "Patricl"的行。在第二条语句中,只考虑有"Pat" <= key_col < "Pau"的行。

下列SELECT语句将不使用索引:

mysql> select * from tbl_name where key_col LIKE “%Patrick%”;PHPChina 开源社区门户)Uf Yd/ HQ!x2W
mysql> select * from tbl_name where key_col LIKE other_col;

在第一条语句中,LIKE值以一个通配符字符开始。在第二条语句中,LIKE值不是一个常数。

如果 column_name 是一个索引,使用column_name IS NULL的搜索将使用索引。

MySQL通常使用找出最少数量的行的索引。一个索引被用于你与下列操作符作比较的列:=、>、>=、<、<=、BETWEEN和一个有一个非通配符前缀象’something%’的LIKE的列。

任何不跨越的在WHERE子句的所有AND层次的索引不用来优化询问。

下列WHERE子句使用索引:

… WHERE index_part1=1 AND index_part2=2
7K$N w1T2E f0… WHERE index=1 OR A=10 AND index=2 /* index = 1 OR index = 2 */
_p|,s.?4T.j;Y0… WHERE index_part1=’hello’ AND index_part_3=5PHPChina 开源社区门户Wz7M+I$_x1J q
/* optimized like “index_part1=’hello’” */

这些WHERE子句不使用索引:

… WHERE index_part2=1 AND index_part3=2 /* index_part_1 is not used */PHPChina 开源社区门户$q~w-D6_I
… WHERE index=1 OR A=10 /* No index */PHPChina 开源社区门户 M5U*F:G]x,k6}g0s
… WHERE index_part1=1 OR index_part2=10 /* No index spans all rows */

 
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:7828396次
    • 积分:153194
    • 等级:
    • 排名:第3名
    • 原创:6348篇
    • 转载:35篇
    • 译文:2篇
    • 评论:2694条
    文章分类
    最新评论
    热门站