MySQL如何利用索引優化ORDER BY排序語句

2022-09-23 07:36:52 字數 1779 閱讀 2541

官網排序優化:

mysql建立索引時支援asc或desc排序。

建立表時同時建立索引降序排序(sname 欄位上普通索引降序)

create

table

tbl1 (

id int

unique, sname varchar(50

),index tbl1_index_sname(sname desc

));

在已有的表建立索引語法

create

[unique|fulltext|spatial

]index

索引名

on 表名(欄位名 [長度]

[asc|desc

]);

mysql也能利用索引來快速地執行order by和group by語句的排序和分組操作。

通過索引優化來實現mysql的order by語句優化:

1、order by的索引優化。如果一個sql語句形如:

select [column1],[column2],…. from [table] order by [sort];

在[sort]這個欄位上建立索引就可以實現利用索引進行order by 優化。

2、where + order by的索引優化,形如:

select [column1],[column2],…. from [table] where [columnx] = [value] order by [sort];

建立一個聯合索引(columnx,sort)來實現order by 優化。

注意:如果columnx對應多個值,如下面語句就無法利用索引來實現order by的優化

select [column1],[column2],…. from [table] where [columnx] in ([value1],[value2],…) order by[sort];

3、where+ 多個欄位order by

select * from [table] where uid=1 order x,y limit 0,10;

建立索引(uid,x,y)實現order by的優化,比建立(x,y,uid)索引效果要好得多。

mysql order by不能使用索引來優化排序的情況

* 對不同的索引鍵做 order by :(key1,key2分別建立索引)

select * from t1 order by key1, key2;

* 在非連續的索引鍵部分上做 order by:(key_part1,key_part2建立聯合索引;key2建立索引)

select * from t1 where key2=constant order by key_part2;

* 同時使用了 asc 和 desc:(key_part1,key_part2建立聯合索引)

select * from t1 order by key_part1 desc, key_part2 asc;

* 用於搜尋記錄的索引鍵和做 order by 的不是同一個:(key1,key2分別建立索引)

select * from t1 where key2=constant order by key1;

* 如果在where和order by的欄位上應用表示式(函式)時,則無法利用索引來實現order by的優化

select * from t1 order byyear(logindate) limit 0,10;

。2>在order by操作中,mysql只有在排序條件不是一個查詢條件表示式的情況下才使用索引。