mysql索引技巧
索引
索引是對數據表一列或多列的值進行排序的一種結構,用于加速基于索引字段的數據排
序以及優化查詢的執行速度,避免全表掃描。索引是直接影響數據庫性能的數據庫模式對
象,因此十分重要。在定義主鍵和唯一鍵約束時數據庫引擎會自動創建相關字段的索引,其
它索引就需要用戶自己定義。索引創建必須慎重,過多的索引將降低數據表的更新效率,因
為數據表每更新一次,索引也需要更新,所以創建索引時需要考慮表的更新頻率。
? ? ? ? ? ? ? ?實踐中可通過測試或試驗選擇適合數據庫的索引方式,一般情況下建索引原則如下:
? ? ? ? ? ? ? ??(1) 在大表上建索引,如果該大表的數據檢索量只占數據總量的一小部分,能明顯提高
數據檢索速度;
? ? ? ? ? ? ? ??(2) 在外鍵或用于表連接的列上建索引,避免數據連接或級聯更新時的全表掃描,提高
表連接速度;
? ? ? ? ? ? ? ??(3) 在常用的數據排序字段上建索引,可提高數據排序速度;
? ? ? ? ? ? ? ??(4) 不擬在具大量空值或重復值的列上建索引;
? ? ? ? ? ? ? ? ?(5) 不擬在頻繁更新的列上建索引。
索引能改進數據檢索速度,卻使數據表的更新效率降低。對于批量裝載或更新,可以考
慮在裝載或更新時刪除索引,裝載或更新完成后再重建索引。索引在數據庫內占用磁盤空間,
在數據庫空間規劃時必須加以考慮。擬為索引創建一個單獨的表空間,并保證該索引表空間
的數據文件與表數據文件分別存儲在不同的磁盤上,避免驅動器爭用,加速數據訪問的整體
性能。
?
-其他設計索引的原則
索引的設計可以遵循一些已有的原則,創建索引的時候請盡量考慮符合這些原則,便于提升索引的使用效率,更高效地使用索引。
搜索的索引列,不一定是所要選擇的列。換句話說,最適合索引的列是出現在WHERE子句中的列,或連接子句中指定的列,而不是出現在SELECT關鍵字后的選擇列表中的列。
使用唯一索引。考慮某列中值的分布。索引的列的基數越大,索引的效果越好。例如,存放出生日期的列具有不同值,很容易區分各行。而用來記錄性別的列,只含有“M”和“F”,則對此列進行索引沒有多大用處,因為不管搜索哪個值,都會得出大約一半的行。
使用短索引。如果對字符串列進行索引,應該指定一個前綴長度,只要有可能就應該這樣做。例如,有一個CHAR(200)列,如果在前10個或20個字符內,多數值是唯一的,那么就不要對整個列進行索引。對前10個或20個字符進行索引能夠節省大量索引空間,也可能會使查詢更快。較小的索引涉及的磁盤 IO 較少,較短的值比較起來更快。更為重要的是,對于較短的鍵值,索引高速緩存中的塊能容納更多的鍵值,因此,MySQL 也可以在內存中容納更多速緩存中的塊能容納更多的鍵值,因此,MySQL 也可以在內存中容納更多的值。這樣就增加了找到行而不用讀取索引中較多塊的可能性。
利用最左前綴。在創建一個n列的索引時,實際是創建了MySQL可利用的n個索引。多列索引可起幾個索引的作用,因為可利用索引中最左邊的列集來匹配行。這樣的列集稱為最左前綴。
不要過度索引。不要以為索引“越多越好”,什么東西都用索引是錯誤的。每個額外的索引都要占用額外的磁盤空間,并降低寫操作的性能。在修改表的內容時,索引必須進行更新,有時可能需要重構,因此,索引越多,所花的時間越長。如果有一個索引很少利用或從不使用,那么會不必要地減緩表的修改速度。此外,MySQL 在生成一個執行計劃時,要考慮各個索引,這也要花費時間。創建多余的索引給查詢優化帶來了更多的工作。索引太多,也可能會使MySQL選擇不到所要使用的最好索引。只保持所需的索引有利于查詢優化。
小結
索引用于快速找出在某個列中有一特定值的行。如果不使用索引,MySQL必須從第1條記錄開始然后讀完整個表直到找出相關的行。表越大,花費的時間越多。如果表中查詢的列有一個索引,MySQL 能快速到達一個位置去搜尋數據文件的中間,沒有必要看所有數據。如果一個表有1000行,這比順序讀取至少快100倍。注意如果需要訪問大部分行,順序讀取要快得多,因為此時應避免磁盤搜索。
大多數MySQL索引(如PRIMARY KEY、UNIQUE、INDEX和FULLTEXT等)在BTREE中存儲。只是空間列類型的索引使用RTREE,并且MEMORY表還支持HASH索引。
?
轉載于:https://www.cnblogs.com/q1104460935/p/6874785.html
總結
- 上一篇: 帝国时代中国城门怎么挡不住敌人
- 下一篇: java 页面传输中文乱码解决方式