mysql 索引失效的情况
程序员文章站
2022-06-02 18:36:32
...
- 索引是为了提高查询效率而建的,索引并不是越多越好,因为每条索引mysql 都维护一个b+ 树,会增加mysql 开销。多了增删改的效率就会降低。
- 对于查询频率比较高的字段建立索引,而且该字段的区分度要高于80%。这样才有意义。
- 查看区分度 count(distinct(book_name))/count(*)
select(select count(distinct(book_name))from book_detail)/(select count(*) from book_detail) as rate;
-
普通索引(除了主键外的索引)
- 创建索引
create index index_name table_name(col_name(lenght));
索引失效的情况
查看索引失效 EXPLAIN sql 语句
例如EXPLAIN SELECT * FROM book_detail WHERE id=123;
type 的值不为all,说明索引有效。
1 使用查询语句的字段类型和数据表中类型不一致,发生了隐式转换
book-cate 是id类型,所以下面的索引失效。
select * from book_deatail where book_cate="123";
- 在条件中使用运算符 +,-,*,/,!
EXPLAIN SELECT * FROM book_detail WHERE book_name != "赢家";
- 条件中使用函数的
SELECT * FROM book_detail WHERE DATE(pub_date)= "1999-7-1";
- 使用or ,如果or 连接的是相同的字段类型不失效,否则失效,book_name 和 author 都是varchar 类型就不会失效
SELECT * FROM book_detail WHERE book_name="债权人" OR author="胡震生";
- 使用模糊查找的,索引失效
SELECT * FROM book_detail WHERE book_name LIKE "_权人";
- not in 会导致索引失效,in 不会
SELECT * FROM book_detail WHERE book_name IN ("离婚","投行风云");
7 is not null 索引失效。
SELECT * FROM book_detail WHERE book_name IS NOT NULL;