SQL優化,索引原則,及mysql不走索引的原因分析

SQL語句優化                                                       
1 企業SQL優化思路
  1、把一個大的不使用索引的SQL語句按照功能進行拆分

  2、長的SQL語句無法使用索引,能不能變成2條短的SQL語句讓它分別使用上索引。

  3、對SQL語句功能的拆分和修改

  4、減少“爛”SQL由運維(DBA)和開發交流(確認),共同確定如何改,最終由DBA執行

  5、制定開發流程

2 不適合走索引的場景
  1、唯一值少的列上不適合建立索引或者建立索引效率低。例如:性別列

  2、小表可以不建立索引,100條記錄。

  3、對於數據倉庫,大量全表掃描的情況,建索引反而會慢

3 查看錶的唯一值數量
select count(distinct user) from mysql.user;
select count(distinct user,host) from mysql.user;
4 建立索引流程
  1、找到慢SQL。

show processlist;
    記錄慢查詢日誌。

  2、explain select句,條件列多。

  3、查看錶的唯一值數量:

select count(distinct user) from mysql.user;
select count(distinct user,host) from mysql.user;
    條件列多。可以考慮建立聯合索引。

  4、建立索引(流量低谷)

force index
  5、拆開語句(和開發)。

  6、like '%%'不用mysql

  7、進行判斷重複的行數

查看行數:

複製代碼
mysql> select count(*) from city;
+----------+
| count(*) |
+----------+
|     4079 |
+----------+
1 row in set (0.00 sec)
複製代碼
查看去重後的行數:

複製代碼
mysql> select count(distinct countrycode) from city;
+-----------------------------+
| count(distinct countrycode) |
+-----------------------------+
|                         232 |
+-----------------------------+
1 row in set (0.00 sec)
複製代碼


mysql不走索引的原因                                
1 一些常見的原因
  1) 沒有查詢條件,或者查詢條件沒有建立索引

  2) 在查詢條件上沒有使用引導列

  3) 查詢的數量是大表的大部分,應該是30%以上。

  4) 索引本身失效

  5) 查詢條件使用函數在索引列上,或者對索引列進行運算,運算包括(+,-,*,/,! 等)

    錯誤的例子:select * from test where id-1=9; 正確的例子:select * from test where id=10;

  6) 對小表查詢

  7) 提示不使用索引

  8) 統計數據不真實

  9) CBO計算走索引花費過大的情況。其實也包含了上面的情況,這裏指的是表佔有的block要比索引小。

  10)隱式轉換導致索引失效.這一點應當引起重視.也是開發中經常會犯的錯誤.

    由於表的字段tel_num定義爲varchar2(20),但在查詢時把該字段作爲number類型以where條件傳給數據庫,這樣會導致索引失效.

      錯誤的例子:select * from test where tel_nume=13333333333;

      正確的例子:select * from test where tel_nume='13333333333';

  11) 注意使用的特殊符號

        1,<>  ,!=

        2,單獨的>,<,(有時會用到,有時不會)

  12)like "%_" 百分號在前.

      select * from t1  where name like 'linux培訓%';

  13) not in ,not exist.

  14)  in  儘量改成 union 。

  15)當變量採用的是times變量,而表的字段採用的是date變量時.或相反情況。

  16)B-tree索引is null不會走,is not null會走,位圖索引 is null,is not null 都會走 。

  17)聯合索引 is not null 只要在建立的索引列(不分先後)都會走,

  in null時 必須要和建立索引第一列一起使用,當建立索引第一位置條件是is null 時,其他建立索引的列可以是is null(但必須在所有列 都滿足is null的時候),或者=一個值;

  當建立索引的第一位置是=一個值時,其他索引列可以是任何情況(包括is null =一個值),以上兩種情況索引都會走。其他情況不會走。

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





數據庫索引的設計原則                                                   
  爲了使索引的使用效率更高,在創建索引時,必須考慮在哪些字段上創建索引和創建什麼類型的索引。

1 那麼索引設計原則又是怎樣的
1.選擇唯一性索引

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

  例如,學生表中學號是具有唯一性的字段。爲該字段建立唯一性索引可以很快的確定某個學生的信息。如果使用姓名的話,可能存在同名現象,從而降低查詢速度。

2.爲經常需要排序、分組和聯合操作的字段建立索引

  經常需要ORDER BY、GROUP BY、DISTINCT和UNION等操作的字段,排序操作會浪費很多時間。

如果爲其建立索引,可以有效地避免排序操作。

3.爲常作爲查詢條件的字段建立索引

  如果某個字段經常用來做查詢條件,那麼該字段的查詢速度會影響整個表的查詢速度。因此,

  爲這樣的字段建立索引,可以提高整個表的查詢速度。

4.限制索引的數目

  索引的數目不是越多越好。每個索引都需要佔用磁盤空間,索引越多,需要的磁盤空間就越大。修改表時,對索引的重構和更新很麻煩。越多的索引,會使更新表變得很浪費時間。

5.儘量使用數據量少的索引

  如果索引的值很長,那麼查詢的速度會受到影響。例如,對一個CHAR(100)類型的字段進行全文檢索需要的時間肯定要比對CHAR(10)類型的字段需要的時間要多。

6.儘量使用前綴來索引

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

7.刪除不再使用或者很少使用的索引

  表中的數據被大量更新,或者數據的使用方式被改變後,原有的一些索引可能不再需要。數據庫管理員應當定期找出這些索引,將它們刪除,從而減少索引對更新操作的影響。

8.小表不應建立索引

  包含大量的列並且不需要搜索非空值的時候可以考慮不建索引

更多免費技術資料可關注:annalin1203

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章