mysql索引讓我們的查詢效率大大提高,但是,也不是所有情況都需要用到mysql索引,下面就讓我們來分析一下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索引。
以下簡稱為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));
那麼mysql索引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";
MySQL索引的用處
mysql索引的不足
實現ADO連接MYSQL的實現
mysql觸發器new old介紹
建立MySQL觸發器的語法