1. 索引是什么,首先我们可以举个例子,字典大家应该都使用过,我们可以使用目录快速定位到所要查找的内容,那么索引跟目录的作用类似,在数据库表记录中,利用索引,可以快速过滤查找到数据记录。
2. 索引类型分类
2.1 普通索引
加快查询速度
2.2 唯一索引
加快查询速度,并且可以限制列值的唯一性,允许为空
唯一索引包括联合唯一索引,多列形成的唯一索引,这些列可以唯一确定一条表记录,可以为空
2.3 全文索引
主要针对文本的内容进行分词,加快查询速度
2.4 联合索引
多列组成的索引,查询效率提升高于多个单列索引合并的效率
2.5 主键索引
主键唯一性,加快查询速度,不能为空
3. 索引结构分类
索引有很多分类,例如B-tree索引,哈希索引,全文索引等等,索引的实现是在存储引擎层,并不是在后端服务器层,所以不同的存储引擎支持的索引结构也不一定一样
3.1 B-tree索引
B-tree 索引普遍存在于存储引擎中,他使用B-tree数据结构来存储数据,如果对树形数据结构比较了解的话,就知道B-tree索引所带来的好处了,他的每个叶子节点都会包含下一个节点的指针,非常方便查询数据
B-tree 适用于全键值,键值范围,或者前缀查找
3.2 哈希索引
哈希索引基于哈希表实现,对于每一行数据,存储引擎会对所有的索引列计算一个哈希码,然后存储引擎会基于这个哈希码来查找数据
3.3 全文索引
全文索引在几种索引结构类型中比较特殊,他查找的是文本中关键词
4. 索引的正确使用
索引是建立在文件上的,会占用一定的内存空间,另外数据在更新的时候也会去维护索引,消耗内存,所以索引一定要正确的使用,索引并不是越多越好,要根据具体的查询业务来规划索引。
索引失效的几种情况:
1. 查询列中有函数计算
2. 查询列中有模糊查询,"%cloum",可以使用"cloum%" 代替,如果要使用"%column%",那么select 列中是索引列
3. 如果查询条件中有or, 索引会失效,除非所有条件都加上索引
4. 使用不等于(!= 或者 <>)
5. is null 或者 is not null
6. 字符串不加引号,会导致索引失效
7. 最左原则,联合索引中会遵循最左原则,即如果要使用联合索引,那么前面的索引列一定要包含,举个例子,
有个联合索引(a,b,c) 那么查询条件中只能是 a=1 或者 a=1 and b=1 或者 a=1 and b=1 and c=1,不然索引就会失效
5. 慢查询日志
慢查询日志是指 mysql中查询 时间超过固定阈值的查询记录,默认时间是10秒,mysql默认情况下不开启慢查询
默认:show variables like '%slow_query_log%';
手动开启:set global slow_query_log=1; 这个只对当前数据库有效,如果重启数据库,则会失效。