1、索引的簡單操做(增刪改查)mysql
建立索引算法
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_namesql
[USING index_type]緩存
ON table_name (index_col_name,...)服務器
[UNIQUE|FULLTEXT|SPATIAL]:表示建立索引的類型,分別表示惟一索引、全文索引、空間索引;ide
[USING index_type]:表示索引的類型,索引類型有BTREE索引和HASH索引。函數
存儲引擎爲MyISAM和INNODB的表中只能使用BTREE;性能
存儲引擎爲MEMORY和heap的表中可使用BTREE索引和HASH索引優化
注意:另外一種建立索引語法url
ALTER TABLE table_name ADD [UNIQUE|FULLTEXT|SPATIAL] INDEX [index_name] [index_type] (index_col_name,...)
查看索引
SHOW INDEX FROM table_name
刪除索引
--刪除指定表中指定名稱的索引
ALTER TABLE table_name DROP INDEX index_name;
修改索引
在mysql中沒有提供修改索引的指令,通常狀況下,直接刪除原索引,從新創建同名索引便可。
舉例:增刪改查索引:在那張表上執行add/drop那個索引
//添加索引
CREATE UNIQUE index index_prizecide on bsy_prizeinfo(prizecode);
//查看索引
show index from bsy_prizeinfo;
//刪除索引
alter table bsy_prizeinfo drop index index_prizecode
//添加索引
alter table bsy_prizeinfo add UNIQUE index index_prizecode (prizecode);
2、索引類型
1)BTREE索引
2)HASH索引
3)空間索引
4)全文索引
3、索引策略
正確建立和使用索引是實現高性能查詢的基礎。
1)獨立的列:索引列不能使表達式的一部分,也不能是函數的參數。
舉例:
explain select * from emp where empno+1=100003;
explain select SQL_NO_CACHE * from emp where TIMESTAMPDIFF(day,hiredate,now())<=2
2)前綴索引和索引選擇性
有時須要索引很長的字符列,索引變得大且慢,利用前綴索引,只索引列開始的部分字符,能夠節約索引空間,提升索引效率。但也會下降索引的選擇性。
索引的選擇性是指:不重複的索引值(基數)和數據表的記錄總數的比值。索引的選擇性高,mysql在查找時過濾更多的行,則查詢效率高。
舉例:
select SQL_NO_CACHE count(DISTINCT loc)/count(*) from dept;
alter table dept add index index_loc (loc(7));
前綴索引是一種能使索引更小、更快的有效辦法,可是有缺點:mysql沒法使用前綴索引作order by 、group by、覆蓋掃描。
3)多列索引
多列索引常見的錯誤是:爲每個列建立獨立的索引,或者按照錯誤的順序建立多列索引。
索引合併策略(index_merge):必定程度上可使用表上的多個單列索引來定位指定的行。索引合併策略有時是一種優化的結果,但實際上更多時候說明了表上的索引建的很糟糕。檢查查詢和表的結構是否是最優,經過參數optimizer_switch來關閉索引合併功能。也可使用ignore index提示優化器忽略掉某些索引。
舉例:
explain select * from emp where deptno='24' or empno='4099904';
·當服務器對多個索引作相交操做時(and),你須要一個包含全部相關列的多列索引,而不是多個獨立的單例索引。
·當服務器對多個索引作聯合操做時(or),一般須要耗費大量CPU和內存資源在算法的緩存、排序、合併上。特別是當索引的選擇性不高,須要合併掃描返回的大量數據的時候。
合適的索引順序:多列索引中索引列的順序意味着索引首先按照最左列進行排序,其次是第二列,等等。索引能夠升序或降序進行掃描,以知足精確符合列順序的order by、group by的distinct等子句。當不須要考慮排序和分組時,將選擇性高的列放在前面一般是很好的。這是索引的做用只是用於優化where條件的查詢。
4)聚簇索引
聚簇索引並非一種單獨的索引類型,而是一種數據存儲方式。具體的細節依賴於其實現方式。由於沒法把數據行存放在兩個不一樣的地方,因此一個表只能有一個聚簇索引。
本章主要關注innodb。在innodb中聚簇索引中保存了索引列和數據行,聚族索引列是主鍵列,若是沒有主鍵,innodb會選擇一個惟一的非空索引代替。若是沒有這樣的索引,innodb會隱式定義一個主鍵來做爲聚簇索引。
優勢:
·數據訪問更快。聚簇索引將索引和數據保存在同一個B-Tree中,所以聚簇索引中獲取數據一般比在非聚簇索引中查找更快。
·使用覆蓋索引掃描的查詢能夠直接使用頁節點中的主鍵值。
缺點:
·二級索引(非聚簇索引)可能比想象的要更大,由於在二級索引的葉子節點包含了引用行的主鍵列。
·二級索引訪問須要兩次索引查找,而不是一次。經過二級索引查找行時,存儲引擎須要找到二級索引的葉子節點得到對應的主鍵值,而後根據這個主鍵值去聚簇索引中查找到對應的行。即爲:兩次B-Tree查找。
InnoDB和MyISAM的數據分佈對比