如何優化一條 order by 的 SQL 語句?

時間 2021-05-29 23:43:35

1樓:cl jin

我不是個高手,但自認為看懂了這個問題,首先我來舉例說明一下為什麼會出現filesort。

首先得了解索引在硬碟中的儲存狀態,復合索引的儲存是按照排列組合的順序排好的,(`city`,`word`,`user_count`)這種索引,他儲存的順序你可以抽象的理解為

(acity,aword,auser_count)

(acity,aword,buser_count)

(acity,bword,auser_count)

(acity,bword,buser_count)

(bcity,aword,auser_count)

(bcity,aword,buser_count)

(bcity,bword,auser_count)

(bcity,bword,buser_count)

每乙個括號就是一條記錄。

這樣一種儲存狀態,復合索引中之所以where中不包含第乙個欄位的時候用不上索引,就是因為這種儲存結構決定了去掉第乙個字段來看,對第二個欄位和第三個字段完全是亂序的,你沒有辦法用二分法快速地定位到所需要的元素。只有在排序好的資料上才能用上二叉樹或者是多叉樹的快速搜尋。

再來看看樓主的索引順序是,`city`,`word`,`user_count`,搜尋時`city`和`word`肯定是用上索引了,orderby的字段加入到索引中所以確定了city 和word 之後的資料是按照user_count排好序的,mysql用不著再進行排序了。 等於是三個欄位都用上了索引。沒有比這個更好的了。

你獲得的資料本來就是按序排序的

auser_count

buser_count

但這裡有乙個變數是用上了模糊搜尋,用了模糊搜尋以後,這裡就會有乙個問題產生:

你可以想象以你好開頭的記錄不止一條,所以索引裡的資料是這樣的。

(ncity, 你好a,auser_count)

(ncity, 你好a,buser_count)

(ncity, 你好b,auser_count)

(ncity, 你好b,buser_count)

所以按照word的索引找出資料以後,得到的user_count的資料是

auser_count

buser_count

auser_count

buser_count

這個樣子的,當然你不能把第一行的auser_count和第三行的auser_count當成一樣的值,這只是為了說明原理。mysql得到這樣一堆資料以後肯定還需要再進行排序,這就是filesort出現的原因。

所以前兩個索引用上了,但最後乙個沒有用上,這看起來沒什麼好辦法解決。

劉項說用上了索引,那是因為只搜了索引的那幾個字段,如果搜其他的字段就用不上索引了,而且這裡的索引只意味著是用了索引來搜尋資料,並沒有告訴你效率是否就是高的。這種方式的效率估計只是比直接查資料庫高那麼一點?

2樓:陳滿硯

我來翻譯一下樓主的題目:

1) 我有乙個index, 名字叫city, 欄位是 city, word, user_count

2) 我有乙個sql 語句, 肉眼看到的是, where 裡面用到city 和 word, order裡面用到user_count

3) 在1) 2) 的前提下, 為蝦公尺還要用到using filesort咧?

我來解答一下樓主的困惑, 如果我說錯了, 請高人指正, 同時說一下我的理解

1) clustered index, 在mysql裡面是不能指定的, primary key 預設就是clustered index, 換句話說, 如果你沒有設定primary key, 那麼, 這個table是沒有clustered index的

2) 分開來看, 如果where 裡面只有city, 肯定是用到index的, 如果是where 裡面有city 和 word, 不管他們的順序如何, 也是可以用到索引的, 問題就在於為啥where 裡面有city 和 word, order 裡面有user_count 就需要用到using filesort列? 其實很簡單

你自己畫一顆BTree, 或者閉上眼睛想一下, 你覺得index的資料結構是怎麼樣的, 模擬一下就知道為啥了.

3樓:楊學海

排序沒看太明白,我在想這個where:

SELECT sql_no_cache id, wordFROM house_keyword

WHERE

'city' in('bj','cn','all') AND left(word,2)='你好'

ORDER BY user_count DESCLIMIT 10

不知道和上面那個哪個效率高些?

4樓:Fenng

為什麼不出現排序?

這個例子挺有意思的,涉及到很多背景知識。比如,基數對 SQL 優化器/直譯器的影響,優化器對 OR 條件的解釋, LIKE 語句,ORDER BY 對排序的影響,降序是否可以優化,索引建立是否合理? 是否有效率...

還有,字段型別的選擇(貌似有點問題)。

優化一條旅遊線路 該從哪些方面入手?

小螞蚱 要考慮到參與的人數 年齡 偏好 體能狀況,先確定交通工具和住宿條件,再根據路況 季節 天氣 節慶活動選擇落腳點。盡量避免折返和換住宿地。避開流行病高發區和政局動盪的地方 這要從你是什麼身份考慮呀?這裡從普通窮遊學生做乙個例子 1,確認好自己在旅行中,想要的是什麼,是去不同的地方感受風土人情還...

如何評價電影《一條狗的回家路》?

not 我想做的,就是正確的。你只能做我想你做的,不然你就是壞人!我想入侵私人領地,是正確的!我想違反租房契約,養寵物,是正確的!我想違反當地法律,養鬥牛犬,是正確的!我只想養狗,不想收養那些貓,是正確的!我不想收養那些貓,但想讓那些貓住在你的領地,但是你修整了自己的領地,影響了貓的生活,所以你是壞...

如何選購一條優雅迷人的連衣裙?

vzvryqxxx 一大波優雅且有女人味的連衣裙來襲 值得收藏的喲都是我瞄了很久的的寶貝物品 如果你也喜歡記得給我乙個小贊贊感謝天感謝地感謝你哈哈哈哈https www video 1136682527896080384 一件往事 復古圓點連衣裙,夏季連衣裙與褶皺裙子在白色與黑色波爾卡圓點,可以搭配...