mysql索引

原创 2007年09月12日 09:52:00

索引被用来快速找出在一个列上用一特定值的行。没有索引,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 */

 

相关文章推荐

MySQL之高效覆盖索引

  • 2016年03月15日 10:47
  • 13KB
  • 下载

MySQL性能优化-关于索引

mysql索引尽管提高了查询的速度,但是也并不是尽善尽美的,mysql索引也有着自身的不足之处,下面就让我们一起来了解一下。 mysql索引的不足之处 过多的使用索引将会造成滥用。因此索引...

mysql存储与索引技术

  • 2011年12月23日 08:38
  • 141KB
  • 下载

MySQL 索引最佳实践

  • 2013年03月14日 17:05
  • 640KB
  • 下载

MySQL添加/删除主键、外键、唯一键、索引、自增

建表是添加外键create table tableName1( id int primary key, name varchar(128) default null, tableName2_id in...

mysql-常见问题,索引优化

  • 2017年11月17日 13:51
  • 388KB
  • 下载

MySQL数据库(索引的操作)

在MySQL数据库中,数据库对象表是存储和操作数据的逻辑结构。 数据库对象索引是一种有效组合数据的方式。通过索引对象,可以快速查询到数据库对象表中的特定记录,是一种提高性能的常用方式。 一个索引会包含...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mysql索引
举报原因:
原因补充:

(最多只允许输入30个字)