??xml version="1.0" encoding="utf-8" standalone="yes"?>
Z个表Q?/span>
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)
);
假设q个表中?/span>10000条记录,其中很分散地分布?/span>5?/span>vc_Name="erquan"的记录,只不q?/span>city,age,school的组合各不相同?/span>
来看q条T-SQLQ?/span>
SELECT i_testID FROM myIndex WHERE vc_Name='erquan' AND vc_City='beijing' AND i_Age=25;
首先考虑建单列烦引:
?/span>vc_Name列上建立了烦引。执?/span>T-SQLӞMYSQL很快目标锁定在?/span>vc_Name=erquan?/span>5条记录上Q取出来攑ֈ一中间 l果集。在q个l果集里Q先排除?/span>vc_City不等?/span>"beijing"的记录,再排?/span>i_Age不等?/span>25的记录,最后筛选出唯一的符合条件的记录?/span>
虽然?/span>vc_Name上徏立了索引Q查询时MYSQL不用扫描整张表,效率有所提高Q但L们的要求q有一定的距离。同LQ在vc_City?/span>i_Age分别建立的单列烦引的效率怼?/span>
Zq一步榨?/span>MySQL的效率,p考虑建立l合索引。就是将vc_Name,vc_City,i_Age建到一个烦引里Q?/span>
ALTER TABLE myIndex ADD INDEX name_city_age (vc_Name(10),vc_City,i_Age);--注意了,Ӟvc_Name长度?/span>50Q这里ؓ什么用10呢?因ؓ一般情况下名字的长 度不会超q?/span>10Q这样会加速烦引查询速度Q还会减烦引文件的大小Q提?/span>INSERT的更新速度?/span>
执行T-SQLӞMySQL无须扫描M记录到扑ֈ唯一的记录!
肯定有h要问了,如果分别?/span>vc_Name,vc_City,i_Age上徏立单列烦引,让该表有3个单列烦引,查询时和上述的组合烦引效率一?/span> 吧?嘿嘿Q大不一Pq远低于我们的组合烦?/span>~~虽然此时有了三个索引Q但MySQL只能用到其中的那个它认ؓg是最有效率的单列索引?/span>
建立q样的组合烦引,其实是相当于分别建立?/span>
vc_Name,vc_City,i_Age
vc_Name,vc_City
vc_Name
q样的三个组合烦引ؓ什么没?/span>vc_City,i_Age{这Ll合索引的效率呢Q这是因?/span>mysqll合索引"最左前~"的结果。简单的理解是只从最左面的开始组合。ƈ不是只要包含q三列的查询都会用到该组合烦引,下面的几?/span>T-SQL会用刎ͼ
SELECT * FROM myIndex WHREE vc_Name="erquan" AND vc_City="beijing"
SELECT * FROM myIndex WHREE vc_Name="erquan"
而下面几个则不会用到Q?/span>
SELECT * FROM myIndex WHREE i_Age=20 AND vc_City="beijing"
SELECT * FROM myIndex WHREE vc_City="beijing"
但什么情况下需要徏立烦引呢Q一般来_在WHERE和JOIN中出现的列需要徏立烦引,但也不完全如此,因ؓMySQL只对 <Q?lt;=Q?Q?gt;Q?gt;=QBETWEENQINQ以及某些时候的LIKE才会使用索引?br />
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='beijing' Ӟ有对myIndex表的vc_City和i_Age建立索引的需要,׃testIndex表的vc_Name开出现在了JOIN子句中,也有对它建立索引的必要?br />
刚才提到只有某些时候的LIKE才需建立索引Q是的。因为在以通配W?% ?_ 开头作查询ӞMySQL不会使用索引Q如
SELECT * FROM myIndex WHERE vc_Name like'erquan%'
会用烦引,?br />
SELECT * FROM myIndex WHEREt vc_Name like'%erquan'
׃会用烦引了?br />
如果没有索引Q执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至扑ֈW合要求的记录。表里面的记录数量越多,q个操作的代价就高。如果作为搜索条件的列上已经创徏了烦引,MySQL无需扫描M记录卛_q速得到目标记录所在的位置。也是说烦引可以大大减数据库理pȝ查找数据的时间?span style="font-size: 14pt; line-height: 173%">索引有哪些优点?
1?span style="font: 7pt Times New Roman">
通过创徏唯一性烦引,可以保证数据库表中每一行数据的唯一性?/span>2?span style="font: 7pt Times New Roman">
可以大大加快数据的检索速度Q这也是创徏索引的最主要原因?/span>3?span style="font: 7pt Times New Roman">
可以加速表和表之间的连接,q在实现数据的参考完整性方面特别有意义?/span>4?span style="font: 7pt Times New Roman">
在用分l和排序子句q行数据索时Q同样可以显著减查询中分组和排序的旉?/span>1?span style="font: 7pt Times New Roman">
创徏索引和维护烦引要耗费旉Q这U时间随着数据量的增加而增加?/span>2?span style="font: 7pt Times New Roman">
除了数据表占数据I间之外Q每一个烦引还要占一定的物理I间Q如果要建立聚簇索引Q需要的I间׃更大?/span>3?span style="font: 7pt Times New Roman">
当对表中的数据进行增加、删除和修改的时候,索引也要动态的l护Q这样就降低了数据的l护速度?/span>1?span style="font: 7pt Times New Roman">
普通烦?/span>q是最基本的烦引类型,而且它没有唯一性之cȝ限制?/span>
2?span style="font: 7pt Times New Roman">
唯一性烦?/span>q种索引和前面的“普通烦?/span>”基本相同Q但有一个区别:索引列的所有值都只能出现一ơ,卛_d一?/span>
3、主?/span>
它是一U特D的唯一索引Q不允许有空倹{?/span>
4、全文烦?/span>
MySQL?/span>
单列索引是把烦引单独徏立在一个字D上?/span>
l合索引复合索引是一个烦引创建在两个列或者多个列上。在搜烦Ӟ当两个或者多个列作ؓ一个关键值时Q最好在q些列上创徏复合索引?/span>
1?span style="font: 7pt Times New Roman">
索引要徏立在l常q行select操作的字D上?/span>q是因ؓQ如果这些列很少用到Q那么有无烦引ƈ不能明显改变查询速度。相反,׃增加了烦引,反而降低了pȝ的维护速度和增大了I间需求?/span>2?span style="font: 7pt Times New Roman">
索引要徏立在值比较唯一的字D上。这样做才是发挥索引的最大效果?/span>Q?/span>比如主键?/span>id字段Q唯一的名?/span>name字段{等。如果烦引徏立在唯一值比较少的字D,比如性别gender字段Q寥寥无几的cd字段{,刚烦引几乎没有Q何意义?/span>3?span style="font: 7pt Times New Roman">
对于那些定义?/span>text?/span> image?/span>bit数据cd的列不应该增加烦引。因些列的数据量要么相当大,要么取值很?/span>4?span style="font: 7pt Times New Roman">
当修Ҏ能q远大于索性能Ӟ不应该创建烦引。修Ҏ能和检索性能是互相矛盄。当增加索引Ӟ会提高检索性能Q但是会降低修改性能。当减少索引Ӟ会提高修Ҏ能Q降低检索性能。因此,当修Ҏ能q远大于索性能Ӟ不应该创建烦引?/span>5?span style="font: 7pt Times New Roman">
?/span>WHERE?/span>JOIN中出现的列需要徏立烦引?/span>6?span style="font: 7pt Times New Roman">
在以通配W?/span> % ?/span> _ 开头作查询ӞMySQL索引是无效的。但?/span>q样索引是有效的Q?/span>select * from tbl1 where name like 'xxx%'Q所以}慎的写你?/span>SQL是很重要的?/span>