mysql 索引優化,索引建立原則和不走索引的原因


第一:選擇唯一性索引

唯一性索引的值是唯一的,可以更快捷的通過該索引來確定某條記錄.

2.索引的列為where 后面經常作為條件的字段建立索引

如果某個字段經常作為查詢條件,而且又有較少的重復列或者是唯一咧可以考慮作為索隱列

經常作為查詢條件的列作為索引會提高速度

3.位經常需要進行排序.分組和聯合操作的的字段建立索引.

order by  group by  distinct union

這種情況下在查詢的時候排序會浪費很多的時間,

如果為其建立索引可以有效的避免排序操作.

4.限制索引的的數目,索引的數目多,對系統的資源也是一種消耗,刪除修改也會費資源.

5.勁量使用數據量少的索引. 或者索引前綴索引.

如果索引的值很長, 查詢速度就會受到影響.

6.盡量使用前綴來索引
如果索引字段的值很長,最好使用值的前綴來索引。例如,TEXT和BLOG類型的字段,進行全文檢索
會很浪費時間。如果只檢索字段的前面的若干個字符,這樣可以提高檢索速度。

7.刪除不再使用的索引.數據或者業務變更,數據方式變更就需要,刪除無用的索引.

8.小表不應該建立索引.

這篇文章主要記錄,我對如何找未使用索引的理解及風險(目前還未找到理想方法),能像oracle保存執行計划,根據執行計划(v$sql_plan)來判斷索引使用情況是比較安全。當然oracle的index monitor特性類似percona的userstat有比較大的風險。

   以下四個工具(方法)是在mysql找未使用索引比較方便,但都存在一定風險

   1、mysqlidxchx

   2、pt-index-usage

   3、userstat

   4、check-unused-keys

   1、mysqlidxchx工具很長時間沒有更新,但主要用來分析general log、slow.log,來判斷實例中那個索引是可以刪除,但這個工具沒有經過實戰,風險很大。

   2、pt-index-usage原理來類似mysqlidxchx,執行過程中性能消耗比較嚴重,如果要在生產庫上部署,最好在凌晨業務低鋒時使用,pt-index-usage只支持slow.log格式的文件,如果要全面分析整個實例索引使用情況,需要long_query_time設置成0,才能把所以的sql記錄下來,但同時會對磁盤空間造成壓力,同時pt-index-usage對大文件分析就是件痛苦的事。當然pt-index-usage可以考慮部分表索引使用情況的確認。

   3、最看好的userstat,收集信息性能優越,成本低。這個patch是google貢獻的(userstat_running),percona把它改名成userstat,默認是不開啟的,開啟是會收集客戶端、索引、表、線程信息存儲在CLIENT_STATISTICS、INDEX_STATISTICS、TABLE_STATISTICS、THREAD_STATISTICS。Userstat的bug導致的問題太嚴重,直接導致mysql crash,到目前淘寶生產環境還沒有使用。

   4、Ryan Lowe的check-unused-keys腳本基於userstat,能夠比較方便輸出需要刪除的索引。

   小結:mysql能把每條sql執行計划保存在性能視圖中,寫入性能視圖成本是非常小,用戶可以根據執行計划來判斷索引使用情況,分析執行計划突變的監控。

=-===================================================

簡單記憶建議索引的原則是 :唯一列 經常被查詢   排序 預先建立索引    總體控制數量   使用字段少的列索引  前綴索引   刪除無用 小表不建

=========================================================================================================================

不走索引的原因:

1.沒有查詢條件沒where 后面的內容  查詢條件沒索引

2.查詢條件沒引導列.  沒有有索引的列

3.查詢數量是超過表的一部分,mysql30%,oracle 20%

4.索引失效,索引插入過多可能發生意外失效

5.查詢條件使用函數在索隱列上面.計算等.

查詢條件使用函數在索引列上,或者對索引列進行運算,運算包括(+,-,*,/,! 等)
錯誤的例子:select * from test where id-1=9; 正確的例子:select * from test where id=10;

6.對小表查詢

7.統計數據不真實.

8.CBO計算走索引花費過大的情況

9查詢條件字符串和數字等的隱式轉換.

10.!= <> 

11.%% 兩個百分號不走索引,開始的結尾的百分號走索引.

14 not in    not exist             in 勁量轉換為union

15, time 和date 時間格式不一致

 

16.17,B-tree索引is null不會走,is not null會走,位圖索引 is null,is not null 都會走

索隱列避免空列,一般選非空的列.

 

====

MyISAM 存儲引擎索引鍵長度總和不能超過1000 字節;
BLOB 和TEXT 類型的列只能創建前綴索引;
MySQL 目前不支持函數索引;
使用不等於(!= 或者<>)的時候MySQL 無法使用索引;
過濾字段使用了函數運算后(如abs(column)),MySQL 無法使用索引;
Join 語句中Join 條件字段類型不一致的時候MySQL 無法使用索引;
使用LIKE 操作的時候如果條件以通配符開始( '%abc...')MySQL 無法使用索引;
使用非等值查詢的時候MySQL 無法使用Hash 索引;
在我們使用索引的時候,需要注意上面的這些限制,
尤其是要注意無法使用索引的情況,因為這很容易讓我們因為疏忽而造成極大的性能隱患。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM