索引用于快速找到与特定的列值的行。如果没有索引,Mysql会从第一行顺序遍历直到找到所有满足条件的行。那么大表就带来很大的消耗。但是如果有索引,mysql可以直接查找中间数据而不用遍历所有数据,效率高很多。
Mysql的索引(PRIMARY KEY, UNIQUE, INDEX, and FULLTEXT)均使用B-trees存储。一些特殊的字段类型使用R-trees,内存存储引擎还支持哈希索引,
对这些操作MySQL使用索引:
迅速找到行匹配一个WHERE子句。
如果有多个索引之间的选择,MySQL通常使用索引,找到最小的(最选择性指数)的行数。
多列索引:
如果表有多个列索引,可以使用任何左边的前缀索引的优化器来查找行。例如,如果你有一个三列的索引(col1、col2 col3),有索引搜索功能(col1),(col1,col2),(col1、col2、col3)。表连接时取行。MySQL可以使用更有效的索引列如果它们声明为相同类型和大小。VARCHAR与CHAR如果长度相同被认为是一样的索引类型可以使用索引。但是大小不同不可以。
对于二进制字符串列之间的比较,这两列应该使用相同的字符集。例如,比较utf8列latin1不能使用索引。
比较如果没有转换值不能直接比较的不同类型列,如字符串列时间或数字列不能使用索引。如数值类型的1和字符串的‘1’不能使用索引。
需要查找一个有索引列的max和min,解析器会先去检查使用where条件的列的索引,再去查找max和min列的索引。在这种情况下,mysql将每个max和min表达式做一个键查找,并替换为一个常数,然后查询返回。