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_name
和first_name
上的索引,这个索引将被用于在last_name
或last_name
和first_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";