mysql索引

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

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

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

索引用于:

快速找出匹配一个WHERE子句的行。
|caTzT0Vb6?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$Nw1T2Ef0… 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索引详解(学习记录)

一:什么是索引 1、索引   索引是表的目录,在查找内容之前可以先在目录中查找索引位置,以此快速定位查询数据。对于索引,会保存在额外的文件中。 2. 索引,是数据库中专门用于帮助用户快速查询数...
  • w670268787
  • w670268787
  • 2016年08月08日 09:12
  • 653

mysql索引深入理解

详解b+树 如上图,是一颗b+树,关于b+树的定义可以参见B+树,这里只说一些重点,浅蓝色的块我们称之为一个磁盘块,可以看到每个磁盘块包含几个数据项(深蓝色所示)和指针(黄色所示),如磁盘块1包...
  • liyantianmin
  • liyantianmin
  • 2017年02月13日 17:27
  • 409

MySQL索引使用方法及实例学

索引用于快速找到特定一些值的记录。如果没有索引,MySQL就必须从第一行记录开始读取整个表来检索记录。表越大,资源消耗越大。如果在字段上有索引的话,MySQL就能很快决定该从数据文件的哪个位置开始搜索...
  • hi_jess
  • hi_jess
  • 2009年10月08日 11:30
  • 2673

MySQL:索引工作原理

MySQL索引原理详解:为什么需要索引(Why),什么是索引(What),什么时候用索引(When),索引怎么工作的(How)...
  • iefreer
  • iefreer
  • 2013年11月15日 16:15
  • 68363

[面试时]MySQL索引背后的数据结构及算法原理

文章转自:http://blog.codinglabs.org/articles/theory-of-mysql-index.html摘要本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话...
  • shawjan
  • shawjan
  • 2015年10月05日 20:58
  • 593

Oracle与Mysql主键、索引及分页的区别小结

1、主键,Oracle不可以实现自增,mysql可以实现自增。  oracle新建序列,SEQ_USER_Id.nextval  2、索引:  mysql索引从0开始,Oracle从...
  • u013047660
  • u013047660
  • 2014年03月12日 20:45
  • 1039

mysql索引的增删改查

创建索引的语法是: CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [USING index_type] ON tbl_name ...
  • longxingzhiwen
  • longxingzhiwen
  • 2016年12月27日 14:57
  • 136

Mysql 数据库优化4---索引缓存

mysql数据库配置优化 缓存索引相关参数:  query_cache 缓存结果集,极高效,与sql语句一一对应,也有弊端,  binlog_cache_size 缓存binlog数据,影响所有写入操...
  • zhuxineli
  • zhuxineli
  • 2012年09月07日 13:57
  • 1071

对于MYSQL索引的一些理解

同样是基于昨天的一道面试题,面试官先是问了下MYSQL的索引是什么结构,我随口就说是B+树的索引,然后他接着追问,B+树索引的特点是什么,然后,就没有然后了。。...
  • bingham2015
  • bingham2015
  • 2015年05月06日 12:20
  • 269

MySQL索引优缺点

一、为什么要创建索引呢(优点)? 创建索引可以大大提高系统的性能。 第一,   通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。 第二,   可以大大加快数据的检索速度,这也是创建索引的最主...
  • qishouzhang
  • qishouzhang
  • 2015年08月30日 11:21
  • 1116
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mysql索引
举报原因:
原因补充:

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