索引是用来加快数据库查询的最重要的技术。
Mysql官方的定义:索引是帮助Mysql高效获取数据的数据结构,所以:索引的本质是数据结构。
数据之外,数据库还存储着满足特定查找算法的数据结构,这种数据结构以某种方式指向数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
索引的分类:
1)B树索引,大部分引擎都支持,包括普通索引,唯一所以和主键索引;
2)Hash索引,只有Memory 引擎支持,使用场景简单;
3)R树索引,空间索引,主要用于存储地理空间,MyISAM
4)Full-text 全文索引,MyISAM,InnoDB 5.6 开始支持
索引的选择原则:
1)较频繁作为查询条件的需要创建索引
2)唯一性太差的不适合单独创建索引;
3)更新非常频繁的数据不适合作为索引。
4)不会出现在where子句中的字段不应该建索引;
5)where 和 join 子句用到的列需要加索引;
6)尽量使用短索引,比如 可以取字符串的前10个字符建立 索引
不建议建立索引的情况:
1)表中数据比较少的时候,比如 少于 2000
2)列的选择性比较低的时候,选择性计算: select count(distinct(column))/count(*) from table;
索引能够使用的操作符: < <= = > >= between in ,like 语句需要不以 % 或 _ 开头
索引的最左匹配原则
1)多列索引,用到左边的索引才能匹配
2)like语句 以 % 或 _ 开头 不能匹配索引
3)范围列 可以用到索引,但是范围列后面的列不能用到索引
4)查询函数中有索引或表达式 则不能用到索引
索引的代价
1)索引需要消耗存储空间
2)索引会加重 插入、删除和修改记录时的负担
3)Mysql运行时需要消耗系统资源维护索引
所以,如果表的记录比较少,字段的选择性比较低,不适合建立索引