一条查询语句选择哪个索引执行 是由优化器决定的。
优化器选择执行代价最低的索引进行执行。 考虑的代价有:执行扫描的行数,是否要排序,有没有涉及到临时表。更具统计信息来判断扫描的行数:索引区分度:区分度小 扫描的行数就会多,然后还要回表,区分度是粗略统计法:随机抽几个数据页, 找到这几页的区分度然后求平均值再乘总页数统计。注意:回表代价也要判断进去。
选错索引的解决办法:force index, 从写sql语句
不走索引的情况:
1.where 后的条件句 字段加了函数
例如: select * from person where month(date) = 7;
2. Mysql中有隐式类型转换
select * from person where age = 123;
这个语句会把 age 转换为整形,相当于给age加了一个转整形的函数
3.
应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
4、尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num=10 or num=20
可以这样查询:
select id from t where num=10
union all
select id from t where num=20