MySQL索引類型總結和應用技能和留意事項。本站提示廣大學習愛好者:(MySQL索引類型總結和應用技能和留意事項)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL索引類型總結和應用技能和留意事項正文
在數據庫表中,對字段樹立索引可以年夜年夜進步查詢速度。假設我們創立了一個 mytable表:
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL );
我們隨機向外面拔出了10000筆記錄,個中有一條:5555, admin。
在查找username="admin"的記載 SELECT * FROM mytable WHERE username='admin';時,假如在username上曾經樹立了索引,MySQL不必任何掃描,即精確可找到該記載。相反,MySQL會掃描一切記載,即要查詢10000筆記錄。
索引分單列索引和組合索引。單列索引,即一個索引只包括單個列,一個表可以有多個單列索引,但這不是組合索引。組合索引,即一個索包括多個列。
MySQL索引類型包含:
1、通俗索引
這是最根本的索引,它沒有任何限制。它有以下幾種創立方法:
1.創立索引
CREATE INDEX indexName ON mytable(username(length));
假如是CHAR,VARCHAR類型,length可以小於字段現實長度;假如是BLOB和TEXT類型,必需指定 length,下同。
2.修正表構造
ALTER mytable ADD INDEX [indexName] ON (username(length)) -- 創立表的時刻直接指定
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, INDEX [indexName] (username(length)) );
-- 刪除索引的語法:
DROP INDEX [indexName] ON mytable;
2、獨一索引
它與後面的通俗索引相似,分歧的就是:索引列的值必需獨一,但許可有空值。假如是組合索引,則列值的組合必需獨一。它有以下幾種創立方法:
CREATE UNIQUE INDEX indexName ON mytable(username(length))
-- 修正表構造
ALTER mytable ADD UNIQUE [indexName] ON (username(length))
-- 創立表的時刻直接指定
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, UNIQUE [indexName] (username(length)) );
3、主鍵索引
它是一種特別的獨一索引,不許可有空值。普通是在建表的時刻同時創立主鍵索引:
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, PRIMARY KEY(ID) );
固然也能夠用 ALTER 敕令。記住:一個表只能有一個主鍵。
4、組合索引
為了抽象地比較單列索引和組合索引,為表添加多個字段:
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, city VARCHAR(50) NOT NULL, age INT NOT NULL );
為了進一步搾取MySQL的效力,就要斟酌樹立組合索引。就是將 name, city, age建到一個索引裡:
ALTER TABLE mytable ADD INDEX name_city_age (name(10),city,age);[code]
建表時,usernname長度為 16,這裡用 10。這是由於普通情形下名字的長度不會跨越10,如許會加快索引查詢速度,還會削減索引文件的年夜小,進步INSERT的更新速度。
假如分離在 usernname,city,age上樹立單列索引,讓該表有3個單列索引,查詢時和上述的組合索引效力也會年夜紛歧樣,遠遠低於我們的組合索引。固然此時有了三個索引,但MySQL只能用到個中的誰人它以為仿佛是最有用率的單列索引。
樹立如許的組合索引,實際上是相當於分離樹立了上面三組組合索引:
usernname,city,age usernname,city usernname 為何沒有 city,age如許的組合索引呢?這是由於MySQL組合索引“最左前綴”的成果。簡略的懂得就是只從最左面的開端組合。其實不是只需包括這三列的查詢都邑用到該組合索引,上面的幾個SQL就會用到這個組合索引:
[code]
SELECT * FROM mytable WHREE username="admin" AND city="鄭州" SELECT * FROM mytable WHREE username="admin"
而上面幾個則不會用到:
SELECT * FROM mytable WHREE age=20 AND city="鄭州" SELECT * FROM mytable WHREE city="鄭州"
5、樹立索引的機會
到這裡我們曾經學會了樹立索引,那末我們須要在甚麼情形下樹立索引呢?普通來講,在WHERE和JOIN中湧現的列須要樹立索引,但也不完整如斯,由於MySQL只對<,<=,=,>,>=,BETWEEN,IN,和某些時刻的LIKE才會應用索引。例如:
SELECT t.Name FROM mytable t LEFT JOIN mytable m ON t.Name=m.username WHERE m.age=20 AND m.city='鄭州'
此時就須要對city和age樹立索引,因為mytable表的userame也湧現在了JOIN子句中,也有對它樹立索引的需要。
適才提到只要某些時刻的LIKE才需樹立索引。由於在以通配符%和_開首作查詢時,MySQL不會應用索引。例以下句會應用索引:
SELECT * FROM mytable WHERE username like'admin%'
而下句就不會應用:
SELECT * FROM mytable WHEREt Name like'%admin'
是以,在應用LIKE時應留意以上的差別。
6、索引的缺乏的地方
下面都在說應用索引的利益,但過量的應用索引將會形成濫用。是以索引也會有它的缺陷:
1.固然索引年夜年夜進步了查詢速度,同時卻會下降更新表的速度,如對表停止INSERT、UPDATE和DELETE。由於更新表時,MySQL不只要保留數據,還要保留一下索引文件。
2.樹立索引會占用磁盤空間的索引文件。普通情形這個成績不太嚴重,但假如你在一個年夜表上創立了多種組合索引,索引文件的會收縮很快。
索引只是進步效力的一個身分,假如你的MySQL有年夜數據量的表,就須要花時光研討樹立最優良的索引,或優化查詢語句。
7、應用索引的留意事項
應用索引時,有以下一些技能和留意事項:
1.索引不會包括有NULL值的列
只需列中包括有NULL值都將不會被包括在索引中,復合索引中只需有一列含有NULL值,那末這一列關於此復合索引就是有效的。所以我們在數據庫設計時不要讓字段的默許值為NULL。
2.應用短索引
對串列停止索引,假如能夠應當指定一個前綴長度。例如,假如有一個CHAR(255)的列,假如在前10個或20個字符內,多半值是唯一的,那末就不要對全部列停止索引。短索引不只可以進步查詢速度並且可以節儉磁盤空間和I/O操作。
3.索引列排序
MySQL查詢只應用一個索引,是以假如where子句中曾經應用了索引的話,那末order by中的列是不會應用索引的。是以數據庫默許排序可以相符請求的情形下不要應用排序操作;盡可能不要包括多個列的排序,假如須要最好給這些列創立復合索引。
4.like語句操作
普通情形下不勉勵應用like操作,假如非應用弗成,若何應用也是一個成績。like “%aaa%” 不會應用索引而like “aaa%”可使用索引。
5.不要在列長進交運算
select * from users where YEAR(adddate)<2007;
將在每一個行長進交運算,這將招致索引掉效而停止全表掃描,是以我們可以改成:
select * from users where adddate<‘2007-01-01';
6.不應用NOT IN和<>操作
以上,就對個中MySQL索引類型停止了引見。願望對年夜家有所贊助。