普通
mysql
執行,資料量和訪問量不大的話,是足夠快的,但是當資料量和訪問量劇增的時候,那麼就會明顯發現
mysql
很慢,甚至
down
掉,那麼就要考慮優化我們的
mysql
了。其中優化
mysql
的乙個重要環節就是為資料庫建立正確合理的索引。
如果沒有索引,執行查詢時mysql必須從第乙個記錄開始掃瞄整個表的所有記錄,直至找到符合要求的記錄。表裡面的記錄數量越多,這個操作的代價就越高。如果作為搜尋條件的列上已經建立了索引,mysql無需掃瞄任何記錄即可迅速得到目標記錄所在的位置。也就是說索引可以大大減少資料庫管理系統查詢資料的時間。
1、 通過建立唯一性索引,可以保證資料庫表中每一 行資料的唯一性。
2、 可以大大加快資料的檢索速度,這也是建立索引 的最主要原因。
3、 可以加速表和表之間的連線,這在實現資料的參 考完整性方面特別有意義。
4、 在使用分組和排序子句進行資料檢索時,同樣可 以顯著減少查詢中分組和排序的時間。
1、 建立索引和維護索引要耗費時間,這種時間隨著 資料量的增加而增加。
2、 除了資料表佔資料空間之外,每乙個索引還要佔 一定的物理空間,如果要建立聚簇索引,需要的空間就會更大。
3、 當對表中的資料進行增加、刪除和修改的時候, 索引也要動態的維護,這樣就降低了資料的維護速度。
1、普通索引
這是最基本的索引類 型,而且它沒有唯一性之類的限制。
2、唯一性索引
這種索引和前面的「普通索引」基本相同,但有乙個區別:索引列的所有值都只能出現一次,即必須唯一。
3、主鍵
它是一種特殊 的唯一索引,不允許有空值。
4、全文索引
mysql從3.23.23版開始支援全 文索引和全文檢索。
單列索引就是 把索引單獨建立在乙個欄位上。
組合索引復合索引就是乙個索引建立在兩個列或者多個列上。在搜尋時,當兩個或者多個列作為乙個關鍵值時,最好在這些列上建立復合索引。
1、 索引要建立在經常進行select操作的字段上。這是因為,如果這些列很少用到,那麼有無索引並不能明顯改變查詢速度。相反,由於增加了索引,反而降低了系統的維護速度和增大了空間需求。
2、 索引要建立在值比較唯一的 欄位上。這樣做才是發揮索引的最大效果。,比如主鍵的id欄位,唯 一的名字name欄位等等。如果索引建立在唯一值比較少的字段,比如性別gender欄位,寥寥無幾的類別欄位等,剛索引幾乎沒有任何意義。
3、 對於那些定義為text、image和bit資料型別的列不應該增加索引。因為這些列的資料量要麼相當大,要麼取值很少。
4、 當修改效能遠遠大於檢索效能時,不應該建立索引。修改效能和檢索效能是互相矛盾的。當增加索引時,會提高檢索效能,但是會降低修改效能。當減少索引時,會提高修改效能,降低檢索效能。因此,當修改效能遠遠大於檢索效能時,不應該建立索引。
5、 在where和join中出現的列需要建立索引。
6、 在以萬用字元%和_開頭作查詢時,mysql索引是無效的。但是這樣索引是有效的:select * fromtbl1 where name like '***%',所以謹慎的寫你的sql是很重要的。
用乙個例子詳細說明單列索引與組合索引的區別及索引使用中的一些細節
建乙個表:
create table myindex (
i_testid int not null auto_increment,
vc_name varchar(50) not null,
vc_city varchar(50) not null,
i_age intnot null,
i_schoolidint not null,
primary key (i_testid)
);
在這10000
條記錄裡面
7 上
8 下地分布了
5 條
vc_name="erquan"
的記錄,只不過
city,age,school
的組合各不相同。
來看這條
t-sql
:
selecti_testid from myindex where vc_name='erquan' andvc_city='鄭 州' and i_age=25;
首先考慮建單列索引:
在vc_name列上建立了索引。執行t-sql時,mysql很快將目標鎖定在了vc_name=erquan的5條記錄上,取出來放到一中間結果集。在這個結果集裡,先排除掉vc_city不等於"鄭州"的記錄,再排除i_age不等於25的記錄,最後篩選出唯一的符合條件的記錄。
雖然在vc_name上建立了索引,查詢時mysql不用掃瞄整張表,效率有所提高,但離我們的要求還有一定的距離。同樣的,在vc_city和i_age分別建立的單列索引的效率相似。
為了進一步榨取mysql的效率,就要考慮建立組合索引。就是將vc_name,vc_city,i_age建到乙個索引裡:
altertable myindex add index name_city_age(vc_name(10),vc_city,i_age);--注意了,建表時,vc_name長度為50,這裡為什麼用10呢?因為一般情 況下名字的長度不會超過10,這樣會加速索引查詢速度,還會減少索引檔案的大小,提高insert的更新速度。
執行t-sql時,mysql無須掃瞄任何記錄就到找到唯一的記錄!!
肯定有人要問了,如果分別在vc_name,vc_city,i_age上建立單列索引,讓該錶有3個單列索引,查詢 時和上述的組合索引效率一樣吧?嘿嘿,大不一樣,遠遠低於 我們的組合索引~~雖然此時有了三個索引,但mysql只能用到其中的那個它認為似乎是最有效率的單列索引。
建立這樣的組合索引,其實是相當於分別建立了
vc_name,vc_city,i_age
vc_name,vc_city
vc_name
這樣的三個組合索引!為什麼沒有vc_city,i_age等這樣的組合索引呢?這是因為mysql組合索引"最左字首"的結果。簡單的理解就是只從最左面的開始組合。並不是只要包含這三列的查詢都會用到該組合索引,下面的幾個t-sql會用到:
select* from myindex whree vc_name="erquan" andvc_city="鄭州"
select* from myindex whree vc_name="erquan"
而下面幾個則不會 用到:
select* from myindex whree i_age=20 and vc_city="鄭州"
select* from myindex whree vc_city="鄭州"
如何正確合理的建立MYSQL資料庫索引
普通mysql執行,資料量和訪問量不大的話,是足夠快的,但是當資料量和訪問量劇增的時候,那麼就會明顯發現mysql很慢,甚至down掉,那麼就要考慮優化我們的mysql了。其中優化mysql的乙個重要環節就是為資料庫建立正確合理的索引。如果沒有索引,執行查詢時mysql必須從第乙個記錄開始掃瞄整個表...
正確合理的建立MYSQL資料庫索引
普通mysql執行,資料量和訪問量不大的話,是足夠快的,但是當資料量和訪問量劇增的時候,那麼就會明顯發現mysql很慢,甚至down掉,那麼就要考慮優化我們的mysql了。其中優化mysql的乙個重要環節就是為資料庫建立正確合理的索引。如果沒有索引,執行查詢時mysql必須從第乙個記錄開始掃瞄整個表...
正確合理的建立MYSQL資料庫索引
在資料庫表中,對欄位建立索引可以大大提高查詢速度。假如我們建立了乙個 mytable表 create table mytable id int not null,username varchar 16 not null 我們隨機向裡面插入了10000條記錄,其中有一條 5555,admin。在查詢u...