mysql索引让我们的查询效率大大提高,但是,也不是所有情况都需要用到mysql索引,下面就让我们来分析一下mysql索引的使用。

mysql中的表有两种key,一种是primary key,还有secondary key。

如:

    CREATETABLElayout_test( col1intNOTNULL, col2intNOTNULL, PRIMARYKEY(col1), KEY(col2) );

col1是primary key,col2是secondary key。它们建立mysql索引。

以下简称为pk和sk。

myisam:

在myisam中,pk和sk的数据存储方式是一样的。都是b-tree的叶节点上存储行号,即数据行的指针。

innodb:

在innodb中不太一样。

pk是以聚簇索引存在的,并且在b-tee的叶节点上存放着primary key的值和其它列的值及事务ID和回滚指针。(innodb的primary index是聚簇索引)

sk的叶节点上也与myisam不太一样,它存放着primary key的值(而不是数据的行指针)。

只有按最左边前缀查询的才会利用上索引。

下面这段来自mysql使用手册:

    mysql>CREATETABLEtest( idINTNOTNULL, last_nameCHAR(30)NOTNULL, first_nameCHAR(30)NOTNULL, PRIMARYKEY(id), INDEXname(last_name,first_name));

那么mysql索引name是一个在last_name和first_name上的索引,这个索引将被用于在last_name或last_name和first_name的一个已知范围内指定值的查询,因此,name索引将使用在下列查询中:

    mysql>SELECT*FROMtestWHERElast_name="Widenius"; mysql>SELECT*FROMtestWHERElast_name="Widenius"ANDfirst_name="Michael"; mysql>SELECT*FROMtestWHERElast_name="Widenius"AND(first_name="Michael"ORfirst_name="Monty"); mysql>SELECT*FROMtestWHERElast_name="Widenius"ANDfirst_name>="M"ANDfirst_name<"N"; 然而,name索引将不用在下列询问中: mysql>SELECT*FROMtestWHEREfirst_name="Michael"; mysql>SELECT*FROMtestWHERElast_name="Widenius"ORfirst_name="Michael";

【编辑推荐】

MySQL索引的用处

mysql索引的不足

实现ADO连接MYSQL的实现

mysql触发器new old介绍

建立MySQL触发器的语法