<
、>
、BETWEEN
走范围索引range。
!=、<>
不走索引
(查看表的索引的语句:show keys from 表名)
like 模糊查询 前模糊或者 全模糊不走索引
or条件走不走索引:1、只要有一个条件字段没有添加索引,就不走索引。
比如:explain select * from users u where u.name = 'mysql测试' or u.password ='JspStudy'
password如果没有加所以,这条sql就不会走索引。
2、or 条件都是同一个索引字段,走索引。
比如:explain select * from users u where u.name= 'mysql测试' or u.name='333'
那么这一天如何使用索引呢?
# 使用 union all 代替 or 这样的话有索引例的就会走索引
explain
select * from users u where u.name = 'mysql测试'
union
select * from users u where u.password = 'JspStudy'
# in 走索引,但是当in的查询范围比较大的时候,索引可能会失效,走全表扫描
# not in 不走索引
exists会不会走索引?
exists是以外层表为驱动表,会全表扫描,而内层表通过走索引,可以快速判断当前记录是否匹配。
所以用exists主查询会全表扫描,子查询可能会使用索引。
SELECT * FROM `user` WHERE `user`.id IN ( SELECT `order`.user_id FROM `order`)
SELECT `user`.* FROM `user` WHERE EXISTS ( SELECT `order`.user_id FROM `order` WHERE `user`.id = `order`.user_id)