排序可能發生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索引取出的結果,本身就是有序的.
select goods_id,cat_id,shop_price from goods order by click_count;
// using filesort 用到了文件排序,即取出的結果再次排序
mysim 執行時全找到 然后排序 然后去回行取 只要有索引走索引 其實不大 聯合索引 點擊量 和 id 可以建索引?
innodb 就在葉子底下
重復索引無意義?
冗余索引 提高效率 兩個索引會發揮場合不同 租用不一樣 左鍵;?
索引的碎片和維護
大網站基本不去刪除數據 在磁盤上會產生一個洞; 并且不容易被再次利用的短字節會不容易再次利用?
內存的碎片化 ;
修復漏洞?
在長期的數據更改過程中, 索引文件和數據文件,都將產生空洞,形成碎片.
我們可以通過一個nop操作(不產生對數據實質影響的操作),
來修改表.
比如: 表的引擎為innodb ,
可以 alter table xxx engine innodb 本質上對數據并沒有任何影響 來修改表 但是會重新整理一遍數據
optimize table 表名 ,也可以修復. 優化這張表 幫你去修復 ;?
注意: 修復表的數據及索引碎片,就會把所有的數據文件重新整理一遍,使之對齊.
這個過程,如果表的行數比較大,也是非常耗費資源的操作.
所以,不能頻繁的修復. 周期較長一點!!!!
如果表的update操作很頻率,可以按周/月,來修復.
如果不頻繁,可以更長的周期來做修復.
?以上就是mysql 優化(5)索引與排序的內容,更多相關內容請關注PHP中文網(www.php.cn)!