思路话语

。Arlen:思想有多远你就能走多远...

mysql索引比较

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

如:

 

CREATE TABLE layout_test (

   col1 int NOT NULL,

   col2 int NOT NULL,

   PRIMARY KEY(col1),

   KEY(col2)

);

 

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

以下简称为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> CREATE TABLE test (
           id INT NOT NULL,
           last_name CHAR(30) NOT NULL,
           first_name CHAR(30) NOT NULL,
           PRIMARY KEY (id),
           INDEX name (last_name,first_name));

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

mysql> SELECT * FROM test WHERE last_name="Widenius";

mysql> SELECT * FROM test WHERE last_name="Widenius"
                          AND first_name="Michael";

mysql> SELECT * FROM test WHERE last_name="Widenius"
                          AND (first_name="Michael" OR first_name="Monty");

mysql> SELECT * FROM test WHERE last_name="Widenius"
                          AND first_name >="M" AND first_name < "N";

然而,name索引将不用在下列询问中:

mysql> SELECT * FROM test WHERE first_name="Michael";

mysql> SELECT * FROM test WHERE last_name="Widenius"
                          OR first_name="Michael";

 

posted on 2009-11-18 16:12  Arlen  阅读(313)  评论(0编辑  收藏  举报

导航