mysql索引比較分析
mysql索引讓我們的查詢效率大大提高,但是,也不是所有情況都需要用到mysql索引,下面就讓我們來(lái)分析一下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。它們建立mysql索引。
以下簡(jiǎn)稱為pk和sk。
myisam:
在myisam中,pk和sk的數(shù)據(jù)存儲(chǔ)方式是一樣的。都是b-tree的葉節(jié)點(diǎn)上存儲(chǔ)行號(hào),即數(shù)據(jù)行的指針。
innodb:
在innodb中不太一樣。
pk是以聚簇索引存在的,并且在b-tee的葉節(jié)點(diǎn)上存放著primary key的值和其它列的值及事務(wù)ID和回滾指針。(innodb的primary index是聚簇索引)
sk的葉節(jié)點(diǎn)上也與myisam不太一樣,它存放著primary key的值(而不是數(shù)據(jù)的行指針)。
只有按最左邊前綴查詢的才會(huì)利用上索引。
下面這段來(lái)自mysql使用手冊(cè):
- 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));
那么mysql索引name是一個(gè)在last_name和first_name上的索引,這個(gè)索引將被用于在last_name或last_name和first_name的一個(gè)已知范圍內(nèi)指定值的查詢,因此,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索引將不用在下列詢問(wèn)中:
- mysql> SELECT * FROM test WHERE first_name="Michael";
- mysql> SELECT * FROM test WHERE last_name="Widenius"
- OR first_name="Michael";
【編輯推薦】