Jian/cnblogs.
MySQL可以使用一个索引来满足ORDERBY子句的排序,而不需要额外的排序,但是需要满足以下几个条件:
(1)WHERE条件和OREDRBY使用相同的索引:即key_part1与key_part2是复合索引,where中使用复合索引中的key_part1
SELECT*FROMuserWHEREkey_part1=1ORDERBYkey_part1DESC,key_part2DESC;
(2)而且ORDERBY顺序和索引顺序相同:
SELECT*FROMuserORDERBYkey_part1,key_part2;
(3)并且要么都是升序要么都是降序:
SELECT*FROMuserORDERBYkey_part1DESC,key_part2DESC;
但以下几种情况则不使用索引:
(1)ORDERBY中混合ASC和DESC:
SELECT*FROMuserORDERBYkey_part1DESC,key_part2ASC;
(2)查询行的关键字与ORDERBY所使用的不相同,即WHERE后的字段与ORDERBY后的字段是不一样的
SELECT*FROMuserWHEREkey2=‘xxx’ORDERBYkey1;
(3)ORDERBY对不同的关键字使用,即ORDERBY后的关键字不相同
SELECT*FROMuserORDERBYkey1,key2;5、OR的优化
当MySQL使用OR查询时,如果要利用索引的话,必须每个条件列都使独立索引,而不是复合索引(多列索引),才能保证使用到查询的时候使用到索引。
比如我们新建一张用户信息表user_info
mysqlselect*fromuser_info;+---------+--------+----------+-----------+
user_id
idcard
name
address
+---------+--------+----------+-----------+
1
Zhangsan
Kunming
2
Lisi
Beijing
3
Wangwu
Shanghai
4
Lijian
Guangzhou
+---------+--------+----------+-----------+4rowsinset
之后创建ind_name_id(user_id,name)复合索引、id_index(id_index)独立索引,idcard主键索引三个索引。
mysqlshowindexfromuser_info;+-----------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
Table
Non_unique
Key_name
Seq_in_index
Column_name
Collation
Cardinality
Sub_part
Packed
Null
Index_type
Comment
Index_