联合索引第一个字段如果是范围查询则不会走索引
如果第一个查询条件用范围查询,那么MySQL会以为你查询的表数据比较多,那么它就会进行全表扫描而不进行索引,,但是如果第一个查询条件是主键范围查询的话,它依旧会走索引,不过在开发中应该不需要进行主键范围查询。
主键范围查询
EXPLAIN SELECT * FROM `employees` WHERE id > 20 AND age = 20
如果使用别的字段进行范围查询的话则不会走索引
EEXPLAIN SELECT * FROM `employees` WHERE name > "" and age > 20
如果进行相等查询的话可以正常走索引
EXPLAIN SELECT * FROM `employees` WHERE name = "" and age > 20
force index强制使用索引
可以使用force index来强制表中字段走explain possible key的索引字段idx_name_age_position
如下所示
EXPLAIN SELECT * FROM `employees` force index(idx_name_age_position) WHERE name > "li" and age > 20;
但是MySQL走索引不一定比全表扫描快,有的时候,MySQL经过优化,全表扫描会比走索引快一些,全表扫描没有进行回表,反而比走索引快些。
走索引前查询需要0.360S
走索引后反而变慢了
or和in不一定后走索引
or和in,如果数据量不大则不会走索引,MySQL会根据表数据进行统计,如果数据量少的话,直接全表扫可能还快些,不然走索引之后还得回表扫描才能拿到数据
例如有两张相同的表,不同之处在于一张表数据多,一张表数据少,
如果进行查询时,数据少的表是没有走索引的:
EXPLAIN SELECT * FROM employees
而数据多的表就可以直接走索引进行查询。