MySQL的order by語句用于根據(jù)指定的列對查詢結(jié)果進行排序。然而,當(dāng)查詢的數(shù)據(jù)量較大時,排序操作會極大地影響查詢性能。因此,如何使order by語句能夠走索引,也就成為了MySQL優(yōu)化的一個非常重要的方面。
如果我們要讓order by語句走索引,就需要在創(chuàng)建索引時特別注意。一般來說,MySQL的B+樹索引是從左到右依次按照索引列的值進行排序的。因此,在創(chuàng)建索引時需要考慮索引列的順序,讓經(jīng)常用作排序的列排在較左的位置。例如,如果我們有以下的一張表:
CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(100) NOT NULL, `age` int(11) NOT NULL, `score` decimal(10,2) NOT NULL, PRIMARY KEY (`id`), KEY `idx_name_age` (`name`,`age`), KEY `idx_score` (`score`) );
如果我們要按照分數(shù)進行排序,就可以利用idx_score索引,例如:
SELECT * FROM student ORDER BY score DESC;
這時MySQL會利用idx_score索引直接完成排序操作。
如果我們需要按照姓名和年齡進行排序,則可以利用idx_name_age索引:
SELECT * FROM student ORDER BY name, age;
這時MySQL會利用idx_name_age索引直接完成排序操作。
需要注意的是,如果排序列中有NULL值,那么默認情況下會被排在最后面。如果我們想要將NULL值排在最前面,可以使用如下的語法:
SELECT * FROM student ORDER BY score IS NULL, score DESC;
這樣MySQL會先保證NULL值排在最前面,然后再按照分數(shù)進行排序。