| 以下为引用的内容: firstname,lastname,age firstname,lastname firstname |
从另一方面理解,它相当于我们创建了(firstname,lastname,age)、(firstname,lastname)以及(firstname)这些列组合上的索引。下面这些查询都能够使用这个fname_lname_age索引:
Chinaz.com
| 以下为引用的内容: 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''; |
五、选择索引列 Www~Chinaz~com
在性能优化过程中,选择在哪些列上创建索引是最重要的步骤之一。可以考虑使用索引的主要有两种类型的列:在WHERE子句中出现的列,在join子句中出现的列。请看下面这个查询:
Www_Chinaz_com
SELECT age ## 不使用索引
FROM people WHERE firstname=''Mike'' ## 考虑使用索引
AND lastname=''Sullivan'' ## 考虑使用索引
这个查询与前面的查询略有不同,但仍属于简单查询。由于age是在SELECT部分被引用,MySQL不会用它来限制列选择操作。因此,对于这个查询来说,创建age列的索引没有什么必要。下面是一个更复杂的例子:
Chinaz^com
| 以下为引用的内容: SELECT people.age, ##不使用索引 town.name ##不使用索引 FROM people LEFT JOIN town ON people.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'';”这个查询不会使用索引。
Www.Chinaz.com
