程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL索引類型總結和應用技能和留意事項

MySQL索引類型總結和應用技能和留意事項

編輯:MySQL綜合教程

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索引類型停止了引見。願望對年夜家有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved