排序可能發生2種情況:
1: 對於覆蓋索引,直接在索引上查詢時,就是有順序的,
using index , 也可能是在查詢時候沿著索引字段排序查詢 。 此時排序代價低
2: 先取出資料,形成臨時表做filesort(文件排序,但文件可能在磁碟上,也可能在記憶體中)
我們的爭取目標-----取出來的資料本身就是有序的!
利用索引來排序.
比如: goods商品表, (cat_id,shop_price)組成聯合索引,
where cat_id=N order by shop_price ,可以利用索引來排序,
select goods_id,cat_id,shop_price from goods order by shop_price;
// using where,按照shop_price索引取出的結果,本身就是有序的.
_lickyselect goods_lickylect goods,cat片_ylelect countprice_ylelect
// using filesort 用到了文件排序,即取出的結果再次排序
mysim 執行時全找到然後排序然後去回行取只要有索引走索引其實不大聯合索引點擊量和id 可以建索引
innodb就在葉子底下
重複索引無意義
冗餘索引提高效率兩個索引會發揮場合不同租用不一樣左鍵;
索引的碎片和維護
大網站基本上不去刪除資料在磁碟上會產生一個洞; 且不容易被再次利用的短字節會不容易再次利用
內存的碎片化;
修復漏洞
在長期的數據更改過程中, 索引文件和數據文件,都將產生空洞,形成碎片.
我們可以透過一個nop操作(不產生對資料實質影響的操作),
來修改表.
例如: 表的引擎為innodb ,
可以alter table xxx engine innodb 本質上對資料並沒有任何影響來修改表格但是會重新整理一遍資料
optimize table 表名,也可以修復. 優化這張表格幫你修復;
注意: 修復表的資料及索引碎片,就會把所有的資料檔重新整理一遍,使之對齊.
這個過程,如果表的行數比較大,也是非常耗費資源的操作.
所以,不能頻繁的修復. 週期較長一點! ! ! !
如果表的Update操作很頻率,可以按週/月,來修復.
如果不頻繁,可以更長的周期來做修復.
以上就是mysql 優化(5)索引與排序的內容,更多相關內容請關注PHP中文網(www.php.cn)!