??xml version="1.0" encoding="utf-8" standalone="yes"?>黄色精品一区二区,日韩一区二区久久,伊人久久久久久久久久久http://www.aygfsteel.com/tmdqn119/archive/2007/09/22/147492.html擦肩而过擦肩而过Sat, 22 Sep 2007 15:19:00 GMThttp://www.aygfsteel.com/tmdqn119/archive/2007/09/22/147492.htmlhttp://www.aygfsteel.com/tmdqn119/comments/147492.htmlhttp://www.aygfsteel.com/tmdqn119/archive/2007/09/22/147492.html#Feedback0http://www.aygfsteel.com/tmdqn119/comments/commentRss/147492.htmlhttp://www.aygfsteel.com/tmdqn119/services/trackbacks/147492.html用一个例子详l说明单列烦引与l合索引的区别及索引使用中的一些细?/span>

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 />



擦肩而过 2007-09-22 23:19 发表评论
]]>
[转蝲]建立正确合理的MYSQL数据库烦??http://www.aygfsteel.com/tmdqn119/archive/2007/09/22/147490.html擦肩而过擦肩而过Sat, 22 Sep 2007 15:18:00 GMThttp://www.aygfsteel.com/tmdqn119/archive/2007/09/22/147490.htmlhttp://www.aygfsteel.com/tmdqn119/comments/147490.htmlhttp://www.aygfsteel.com/tmdqn119/archive/2007/09/22/147490.html#Feedback0http://www.aygfsteel.com/tmdqn119/comments/commentRss/147490.htmlhttp://www.aygfsteel.com/tmdqn119/services/trackbacks/147490.html普?/span>MySQLq行Q数据量和访问量不大的话Q是_快的Q但是当数据量和讉K量剧增的时候,那么׃明显发现MySQL很慢Q甚?/span>down掉,那么p考虑优化我们?/span>MySQL了,其中优化MYSQL的一个重要环节就是ؓ数据库徏立正合理的索引?/span>

如果没有索引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>3.23.23版开始支持全文烦引和全文索?/span>

 单列索引和组合烦引:

单列索引是把烦引单独徏立在一个字D上?/span>

l合索引复合索引是一个烦引创建在两个列或者多个列上。在搜烦Ӟ当两个或者多个列作ؓ一个关键值时Q最好在q些列上创徏复合索引?/span>

 建立和用烦引有哪些注意事项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>



擦肩而过 2007-09-22 23:18 发表评论
]]>
վ֩ģ壺 ̨| ¹| | ɽ| | | | ɳ| Զ| | | µ| | ƺ| | | | կ| н| | ̫| μ| ׸| | | | | | | ƽ| ƽ| | | | ƴ| Զ| | | | | |