mysql索引 - mysql的表如何重新組織(或產生)索引?
淡淡烟草味
淡淡烟草味 2017-05-18 10:52:38
0
3
907

1,背景描述
我有一個user表,表格結構如下:

索引如下:

表中資料如下:

##可以看到表中資料是按lastname排序的,這是因為在lastname, familyname, city上有一個多列索引,userid上的主鍵(索引)是後來加上的,所以userid是無序的。
mysql當中有沒有一種方法可以重新產生(或組織)索引,讓select userid, lastname from user這條語句的查詢結果預設是依照userid排序?

注意:不是強制使用索引select userid, lastname, from user force index(primary),而是重新產生或組織索引(reorganize)。


4月29日更新

其實,我這裡是想問mysql是不是有某個指令可以對錶中已有的索引進行重新組織,就是在表經過一段時間的更新、刪除、插入操作後,資料會改變(結構不變),那麼表的索引也就相應的會發生各種變化(例如底層的碎片等),那麼是不是有一種方法可以對這些索引重新組織或重新生成,再不然就只能刪除索引再重建索引。


5月2日更新我把最初提問的問題增加了刪除線,開始的提問有些問題,特別是這兒的描述是錯誤的:
「可以看到表中資料是按lastname排序的,這是因為在lastname, familyname, city上有一個多列索引,userid上的主鍵(索引)是後加的,所以userid是無序的可以看到表中資料是按lastname排序的,這是因為在lastname, familyname, city上有一個多列索引,userid上的主鍵(索引)是後加的,所以userid是無序的」,至於為什麼是無序的,@clcx_1315已經回答了,而且他也指出即便重新組織(生成)索引,這句select userid, lastname from user也是無法實現讓userid有序的。我百度了下,mysql當中好像沒有專門用於重新生成或組織索引的指令,sql server資料庫倒是有,有興趣的朋友百度吧。

淡淡烟草味
淡淡烟草味

全部回覆(3)
阿神

mysql有optimize table的用法,但是同時也把表重組了。
如果系統有明顯的業務低高峰期,刪除索引重建也是可以的。

刘奇

這種情況是因為你主鍵外的其他列是一個複合索引,你查詢的時候mysql就直接走索引表找到你的所有資料(mysql innodb普通索引會將主鍵資訊一併儲存),所以就是按照你索引首字段排序檢索,他並不是按照錄入磁碟順序讀取全表的,而主鍵則是按照磁碟錄入順序添加的,因此在磁碟上是順序的,但是你讀取的時候讀的是索引表才會是不連續的
要改變這種狀況的話你重建表也是一樣的,仍然會按lastname得索引排序,除非你按照lastname的順序錄入
另外一個辦法就是添加一個冗餘字段,這時候再select全表的時候就不會走你的覆蓋索引查詢而是走全表掃描,當然就會主鍵漸順序排列了。

伊谢尔伦

我記得mysql也會根據你的索引情況自動對索引進行重建,具體根據什麼也沒查到。
留待有緣人解答

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!