在查找vc_Name="erquan"的纪录
SELECT * FROM testIndex WHERE vc_Name='erquan';
时,假如在vc_Name上已创立了索引,MySql不必任何扫描,即正确可找到该纪录!相反,MySql会扫描一切纪录,即要查询1000次啊~~可以索引将查询速度进步100倍。
1.通俗索引。
这是最根基的索引,它没有任何限制。它有以下几种创立体例:
(1)创立索引:CREATE INDEX indexName ON tableName(tableColumns(length));假如是CHAR,VARCHAR类型,length可以小于字段实践长度;假如是BLOB 和 TEXT 类型,必需指定length,下同。
(2)修正表布局:ALTER tableName ADD INDEX [indexName] ON (tableColumns(length))
(3)创立表的时分直接指定:CREATE TABLE tableName ( [...], INDEX [indexName] (tableColumns(length)) ;
2.独一索引。
它与后面的"通俗索引"相似,分歧的就是:索引列的值必需独一,但答应有空值。假如是组合索引,则列值的组合必需独一。它有以下几种创立体例:
(1)创立索引:CREATE UNIQUE INDEX indexName ON tableName(tableColumns(length))
(2)修正表布局:ALTER tableName ADD UNIQUE [indexName] ON (tableColumns(length))
(3)创立表的时分直接指定:CREATE TABLE tableName ( [...], UNIQUE [indexName] (tableColumns(length));
3.主键索引
它是一种特别的独一索引,不答应有空值。通常为在建表的时分同时创立主键索引:CREATE TABLE testIndex(i_testID INT NOT NULL AUTO_INCREMENT,vc_Name VARCHAR(16) NOT NULL,PRIMARY KEY(i_testID)); 固然也能够用ALTER号令。
记住:一个表只能有一个主键。
4.全文索引
MySQL从3.23.23版入手下手撑持全文索引和全文检索。这里不作会商,呵呵~~
删除索引的语法:DROP INDEX index_name ON tableName
3、单列索引和组合索引
为了抽象地对照二者,再建一个表:
CREATE TABLE myIndex ( i_testID INT NOT NULL AUTO_INCREMENT, vc_Name VARCHAR(50) NOT NULL, vc_City VARCHAR(50) NOT NULL, i_Age INT NOT NULL, i_SchoolID INT NOT NULL, PRIMARY KEY (i_testID) );
在这10000笔记录外面7上8下地散布了5条vc_Name="erquan"的纪录,只不外city,age,school的组合各不不异。
来看这条T-SQL:
SELECT i_testID FROM myIndex WHERE vc_Name='erquan' AND vc_City='郑州' AND i_Age=25;
为了进一步榨取MySQL的效力,就要思索创立组合索引。就是将vc_Name,vc_City,i_Age建到一个索引里:
ALTER TABLE myIndex ADD INDEX name_city_age (vc_Name(10),vc_City,i_Age);--注重了,建表时,vc_Name长度为50,这里为何用10呢?由于普通情形下名字的长度不会超越10,如许会减速索引查询速度,还会削减索引文件的巨细,进步INSERT的更新速度。
创立如许的组合索引,实际上是相当于分离创立了
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" AND vc_City="郑州"
SELECT * FROM myIndex WHREE vc_Name="erquan"
而上面几个则不会用到:
SELECT * FROM myIndex WHREE i_Age=20 AND vc_City="郑州"
SELECT * FROM myIndex WHREE vc_City="郑州"
4、利用索引
到此你应当会创立、利用索引了吧?但甚么情形下需求创立索引呢?普通来讲,在WHERE和JOIN中呈现的列需求创立索引,但也不完整如斯,由于MySQL只对 <,<=,=,>,>=,BETWEEN,IN,和某些时分的LIKE(前面有申明)才会利用索引。
SELECT t.vc_Name FROM testIndex t LEFT JOIN myIndex m ON t.vc_Name=m.vc_Name WHERE m.i_Age=20 AND m.vc_City='郑州' 时,有对myIndex表的vc_City和i_Age创立索引的需求,因为testIndex表的vc_Name开呈现在了JOIN子句中,也有对它创立索引的需要。
方才提到了,只要某些时分的LIKE才需创立索引?是的。由于在以通配符 % 和 _ 开首作查询时,MySQL不会利用索引,如
SELECT * FROM myIndex WHERE vc_Name like'erquan%'
会利用索引,而
SELECT * FROM myIndex WHEREt vc_Name like'%erquan'
就不会利用索引了。