mysql索引淺談

ew3y 9年前發布 | 10K 次閱讀 MySQL 數據庫服務器

索引的作用:
        提高數據檢索效率
        提高聚合函數效率
        提高排序效率
        個別時候可以避免回表
        減少多表關聯時掃描行數
        主鍵、唯一索引可以作為約束
        列定義為DEFAULT NULL時,NULL值也會有索引,存放在索引樹的最前端部分
mysql 支持的索引:
    普通索引:create index idx_xxx on tb(xxx)   alter table tb add index idx_xxx(xxx)
              包括前綴索引 alter table yw add indx idx_c6_6(c6(6)) 減少一下索引的長度,讓掃起來更省點IO
               在普通索引的列是可以NULL  索引不會包含有NULL值的列找
    唯一索引:是一種約束,要求字段是唯一的。 唯一索引列可以允許有NULL,但只能有一個
    主鍵索引:Innodb里聚集key,所有的數據以主建排序存儲
    組合索引:
    全文索引:

什么情況不適用索引:
        通過索引掃描的記錄數超過30%,變成全表掃描
        聯合索引中,第一個索引列使用范圍查詢
        聯合索引中,第一個查詢條件不是最左索引列
        模糊查詢條件列最左以通配符 % 開始
        內存表(HEAP 表)使用HASH索引時,使用范圍檢索或者ORDER BY
        兩個獨立索引,其中一個用于檢索,一個用于排序
        使用了不同的 ORDER BY 和 GROUP BY 表達式
        兩個表關聯字段類型不一樣(也包括長度不一樣),5.1開始的版本已經不復存在了


復雜關聯SQL的優化原則

        查詢所返回的結果集,通常查詢返回的結果集很少的,就比較容易優化;
        驅動表的選擇至關重要,通過查看執行計劃,可以看到優化器選擇的驅動表,從執行計劃中的rows可以大致反映出問題的所在;
        理清各表之間的關聯關系,注意關聯字段上是否有合適的索引;
        使用straight_join關鍵詞來強制表之間的關聯順序,可以方便我們驗證某些猜想;

DISABLE/ENABLE KEYS的作用
        只對MyISAM表有效
        導入大量數據之前,禁用索引
        加速數據導入效率
        導入完成后,再啟用索引

 MySQL不支持函數索引、運算
        索引列上使用函數后,無法使用索引,可能導致全表掃描
        索引列上不能附加運算表達式,否則也無法使用索引

RAND()優化
        指導思想:從MySQL數據庫中隨機取一條或者N條記錄時,最好把RAND()生成隨機數放在JOIN子查詢中以提高效率。
        SELECT id FROM table ORDER BY RAND() LIMIT n;
        =>優化
        SELECT id FROM table t1 JOIN (SELECT RAND() * (SELECT MAX(id) FROM table) AS nid) t2 ON t1.id > t2.nid LIMIT n;

范圍查詢:>、<、>=、<=、BETWEEN
等值查詢:=  in

由于時間有限,亂七八糟的說了這么多也沒有一個實例木有說服力。但是請大家記住:

MySQL優化的核心秘訣:
        核心概念: 減少IO(能不能用順序IO)
        實際行動: 控制結果集大小,爭取1秒完成


個人建議就不要用myisam:
    1.myisqm : CPU利用,只能用到一核
    2.內存: 只能緩存索引,最多只有用到4個G
    3.表級鎖, 容易出現表crash

 本文由用戶 ew3y 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!