建立2張使用者表user、user2,表結構相同,但user表使用InnoDB儲存引擎,而user2表則使用 MyISAM儲存引擎。
-- Table "user" DDLCREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL, `email` varchar(100) DEFAULT NULL, `age` tinyint(4) DEFAULT NULL, `nickname` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `email` (`email`), KEY `name` (`name`), KEY `age` (`age`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- Table "user2" DDLCREATE TABLE `user2` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL, `email` varchar(100) DEFAULT NULL, `age` tinyint(4) DEFAULT NULL, `nickname` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `email` (`email`), KEY `name` (`name`), KEY `age` (`age`)) ENGINE=MyISAM AUTO_INCREMENT=131610 DEFAULT CHARSET=utf8;
分別插入10W條測試資料到表user & user2。
<?php$example = array( '@qq.com', '@sina.com.cn', '@163.com', '@126.com', '@gmail.com', '@yahoo.com', '@live.com', '@msn.com', '@cisco.com', '@microsoft.com', '@ibm.com', '@apple.com');$con = mysql_connect("localhost", "root", "your_mysql_password");mysql_select_db("index_test", $con);//添加10W測試資料到表 user & user2for($i=0; $i<100000; $i++){ $temp = md5(uniqid()); $name = substr($temp, 0, 16); $email = substr($temp, 8, 12).$example[array_rand($example, 1)]; $age = rand(18, 99); $nickname = substr($temp, 16, 16); mysql_query("INSERT INTO user(name,email,age,nickname) VALUES('$name','$email',$age,'$nickname')"); mysql_query("INSERT INTO user2(name,email,age,nickname) VALUES('$name','$email',$age,'$nickname')");}mysql_close($con); echo 'success';?>
對索引的流量分析
Explain Select * from user where id>100 \G;
圖1
Explain Select * from user2 where id>100 \G;
圖2
User 表中的資料和 User2 表中的資料是一樣的,索引結構也是一樣的,只不過它們的儲存引擎不同。在圖1中,查詢用到了PRIMARY主鍵索引,而查詢最佳化工具預估的結果大概在65954行左右(實際是131513);在圖2中,查詢卻沒有使用索引,而是全表掃描了,返回的預估結果在131608行(實際是131509)。
Explain Select * from user where id>100 and age>50 \G;
圖3
Explain Select * from user where id>100 and age=50 \G;
圖4
Explain Select * from user2 where id>100 and age>50 \G;
圖5
Explain Select * from user2 where id>100 and age=50 \G;
圖6
分享一個不錯的部落格,《理解MySQL--索引和最佳化》