MySQL索引使用全程分析

时间:2022-08-31 12:22:32

创建2张用户表user、user2,表结构相同,但user表使用InnoDB存储引擎,而user2表则使用 MyISAM存储引擎。 

复制代码代码如下:


-- Table "user" DDL 
CREATE 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" DDL 
CREATE 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 & user2 
for($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; 
MySQL索引使用全程分析 
图1 
Explain Select * from user2 where id>100 \G; 
MySQL索引使用全程分析 
图2 
User 表中的数据和 User2 表中的数据是一样的,索引结构也是一样的,只不过它们的存储引擎不同。在图1中,查询用到了PRIMARY主键索引,而查询优化器预估的结果大概在65954行左右(实际是131513);在图2中,查询却没有使用索引,而是全表扫描了,返回的预估结果在131608行(实际是131509)。 
Explain Select * from user where id>100 and age>50 \G; 
MySQL索引使用全程分析 
图3 
Explain Select * from user where id>100 and age=50 \G; 
MySQL索引使用全程分析 
图4 
Explain Select * from user2 where id>100 and age>50 \G; 
MySQL索引使用全程分析 
图5 
Explain Select * from user2 where id>100 and age=50 \G; 
MySQL索引使用全程分析 
图6