亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

mysql 為什么主鍵排序用不到索引

mysql 為什么主鍵排序用不到索引

Helenr 2019-04-13 08:46:00
CREATETABLE`user`(`id`INT(11)NOTNULLAUTO_INCREMENT,`name`VARCHAR(20)DEFAULTNULL,`num`INT(11)DEFAULTNULL,`email`VARCHAR(20)DEFAULTNULL,PRIMARYKEY(`id`),KEY`NewIndex1`(`num`))ENGINE=MYISAMAUTO_INCREMENT=1DEFAULTCHARSET=utf8DESCSELECT*FROM`user`ORDERBYidDESCDESCSELECT*FROM`user`ORDERBYnumDESC#都用不到索引idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra1SIMPLEuserALLNULLNULLNULLNULL40000UsingfilesortDESCSELECT*FROM`user`WHEREnum=23ORDERBYnumDESC#可以用到索引idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra1SIMPLEuserrefNewIndex1NewIndex15const1NULL或者使用innodb引擎也可以在主鍵排序的時候用到索引這是為什么?
查看完整描述

2 回答

?
婷婷同學_

TA貢獻1844條經驗 獲得超8個贊

1).對mysql,innodb,你的第一條sql
DESCSELECT*FROM`user`ORDERBYidDESC
一定會顯示使用了主鍵索引.因為innodb是indexclusteredtable,數據項在主鍵索引的葉節點上.所以肯定可以用主鍵排序.
2).innodb的二級索引存的是當前column+對應的主鍵,查詢時用主鍵值去主鍵索引中查詢相對應的row.
InInnoDB,eachrecordinasecondaryindexcontainstheprimarykey
columnsfortherow,aswellasthecolumnsspecifiedforthe
secondaryindex.InnoDBusesthisprimarykeyvaluetosearchforthe
rowintheclusteredindex.
DESCSELECT*FROM`user`ORDERBYnumDESC
這條語句如果用num上的索引來排序,則按num索引的順序去主鍵索引查,極端情況下就是40000次隨機查詢.反而不如做filesort來的快.
3).
SELECT*FROM`user`WHEREnum=23ORDERBYnumDESC
這條和:
SELECT*FROM`user`WHEREnum=23
有差別么?直接索引找到num=23的列就完了.
如果結果集較小,比如:
SELECT*FROM`user`WHEREnumbetween23and30ORDERBYnumDESC
則可能會是用num上的索引排序.
                            
查看完整回答
反對 回復 2019-04-13
?
千萬里不及你

TA貢獻1784條經驗 獲得超9個贊

首先先明確一點,SELECT*FROMuserORDERBYidDESC里沒有任何過濾條件,而且你返回了所有字段,所以這是一個全表掃面的SQL。
對于這種SQL,MySQL的優化策略是不使用索引,因為全表掃描終究會把所有的記錄都讀一遍,如果不使用索引,MySQL可以按照磁盤上的順序讀取數據,對于傳統硬盤而言,這是吞吐量最大的讀方式,如果使用了索引,很可能會造成大量的隨機讀,反倒會慢下來。
當然這種優化策略只是一種估計,所以MySQL可能會猜錯,如果你堅信自己是對的,你可以強制MySQL使用索引,比如:SELECT*FROMuserFORCEKEY(id)ORDERBYidDESC
或者:SELECT*FROMuserFORCEINDEX(NewIndex1)ORDERBYnumDESC
或者你還可以試一下只返回少數制定字段,比如:SELECTnumFROMuserORDERBYidDESC
                            
查看完整回答
反對 回復 2019-04-13
  • 2 回答
  • 0 關注
  • 521 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號