举个例子:新华字典,有目录,有正文内容。索引就至关于目录,正文内容就至关于数据。
索引用于快速查找在某列中有一特定值的行。
一条查询语句,若是没有索引,将对全表进行扫描。函数
若是全部的数据页面都不在内存中,则须要从硬盘上读取这些页面,从而产生大量的I/O,每次I/O都会消耗必定时间。code
最终,总的查询时间,会大的惊人。索引
若此时查询列有个索引,MYSQL 就能快速定位到具体位置,找出相关列,将指定数据页面读入内存,I/O 就会大大下降。内存
以字典为例,查找字母为 Z 开头的某个单词,先经过索引定位 Z 开头的单词的起始位置,从这里开始查询,从而节省了大量的时间。
一次查询只能使用一个索引。
like “%xxx” not in , != 对列进行函数运算的状况(如 where avg(age) = “20”)
explain select ...
假设,你有一个三列联合的索引:(col1, col2, col3)。字符串
那么你将拥有三种索引使用方式:效率
(col1) (col1, col2) (col1, col2, col3)
上述说的就是最左前缀 - leftmost prefix。select
So,当你有多列查询需求时,你能够考虑建一个合适的联合索引。引用
like 的参数不以非通配符 % 开头的字符常量,就能使用索引。数据
SELECT * FROM tbl_name WHERE key_col LIKE 'something%'; //匹配以something开头的字符串 SELECT * FROM tbl_name WHERE key_col LIKE '%something%'; //不使用索引 SELECT * FROM tbl_name WHERE key_col LIKE 'something'; //精确匹配,等效于 “ = ” 运算符
假如,你在看一本成语词典,目录是按成语拼音顺序创建。查询
查询需求是:你想找以 “一” 字开头的成语(“一%”),和你想找包含一字的成语(“%一%”)。
你以为哪一个会更快呢?
大多数状况下,索引都能大幅度提升查询效率。
数据的增、删、改操做都须要维护索引,索引一多,意味着维护成本高了。 更多的索引须要更多的存储空间。好比:20页的书,有15页的目录?这就不合理了。 小表建索引,每每拔苗助长。好比:读个2页的宣传手册,你还先去找目录?
更新很是频繁的列 列的值惟一性过小,好比性别,Enum 类型的字段等 太长的列