说到数据库大家都对索引不是很陌生,大家也都基本上知道怎么建立索引,索引不生效的原因。常见的索引不生效的原因有如下几个原因:
- 没有遵从最左原则
- 索引字段使用了is null,is not null
- 索引字段使用了like
- sql语句中使用了 or ,那么or 前的条件中的列有索引,而后面的列索引都不会被用到
- 如果列类型是字符串,在 where 条件中把字符常量值用引号引起来,否则索引失效
- 。。。。。
还有很多失效的原因。但是呢,之前我碰到一种情况,假设我有一张表,三个字段,id,a,b,建立了两个索引,一个index(a),一个index(b),我有一条sql是这样的
select id,a,b from t where a = 1
其实这条sql的话正常的话应该是可以直接使用index(a)的但是我的这个数据库并没有使用这个索引。按照现在这个思路,肯定不是索引的问题而是数据库用错了索引。
在网上找到了一个force index这个,可以强制sql语句使用哪个固定的索引。sql语句如下:
select id,a,b from t forceindex(a) where a = 1
使用explain去看确实使用了index(a)。这要是平时练习这么做法是可以的,但是其实开发中这个是不建议的。
后来我采用的一种新的方法是使用Analyze Table语句来修复索引。
Analyze Table tableName
我的操作可能导致我的索引的统计信息出现了错误,所以导致我的索引失效了,具体更深的我还在学习,为什么没有放图片呢,因为我的本地的mysql今天突然起不来了,难受,等恢复了再来放图片。