手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网络编程>Mysql>列表

加速动态网站 MySQL索引分析和优化

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

  四、最左前缀

  多列索引更有另外一个长处,他通过称为最左前缀(Leftmost Prefixing)的概念体现出来。继续考虑前面的例子,现在我们有一个firstname、lastname、age列上的多列索引,我们称这个索引 为fname_lname_age。当搜索条件是以下各种列的组合时,MySQL将使用fname_lname_age索引:

  firstname,lastname,agefirstname,lastnamefirstname

  从另一方面理解,他相当于我们创建了(firstname,lastname,age)、(firstname,lastname)连同(firstname)这些列组合上的索引。下面这些查询都能够使用这个fname_lname_age索引:

  SELECT peopleid FROM people WHERE firstname='Mike' AND lastname='Sullivan' AND age='17'; SELECT peopleid FROM people WHERE firstname='Mike' AND lastname='Sullivan'; SELECT peopleid FROM people WHERE firstname='Mike'; The following queries cannot use the index at all: SELECT peopleid FROM people WHERE lastname='Sullivan'; SELECT peopleid FROM people WHERE age='17'; SELECT peopleid FROM people WHERE lastname='Sullivan' AND age='17';

  五、选择索引列

  在性能优化过程中,选择在哪些列上创建索引是最重要的步骤之一。能够考虑使用索引的主要有两种类型的列:在WHERE子句中出现的列,在join子句中出现的列。请看下面这个查询:

  SELECT age ## 不使用索引FROM people WHERE firstname='Mike' ## 考虑使用索引AND lastname='Sullivan' ## 考虑使用索引

  这个查询和前面的查询略有不同,但仍属于简单查询。由于age是在SELECT部分被引用,MySQL不会用他来限制列选择操作。因此,对于这个查询来说,创建age列的索引没有什么必要。下面是个更复杂的例子:

  SELECT people.age, ##不使用索引town.name ##不使用索引FROM people LEFT JOIN town ONpeople.townid=town.townid ##考虑使用索引WHERE firstname='Mike' ##考虑使用索引AND lastname='Sullivan' ##考虑使用索引

  和前面的例子相同,由于firstname和lastname出现在WHERE子句中,因此 这两个列仍旧有创建索引的必要。除此之外,由于town表的townid列出现在join子句中,因此我们需要考虑创建该列的索引。那么,我们是否能够简 单地认为应该索引WHERE子句和join子句中出现的每一个列呢?差不多如此,但并不完全。我们还必须考虑到对列进行比较的操作符类型。MySQL只有 对以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,IN,连同某些时候的LIKE。能够在LIKE操作中使用索 引的情形是指另一个操作数不是以通配符(%或_)开头的情形。例如,“SELECT peopleid FROM people WHERE firstname LIKE 'Mich%';”这个查询将使用索引,但“SELECT peopleid FROM people WHERE firstname LIKE '%ike';”这个查询不会使用索引。


文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!