MySQL索引使用全程分析

2022-11-12 09:23:18
内容摘要
这篇文章主要为大家详细介绍了MySQL索引使用全程分析,具有一定的参考价值,可以用来参考一下。 对此感兴趣的朋友,看看idc笔记做的技术笔记!创建2张用户表user、user2,表结构相同
文章正文

这篇文章主要为大家详细介绍了MySQL索引使用全程分析,具有一定的参考价值,可以用来参考一下。

对此感兴趣的朋友,看看idc笔记做的技术笔记!

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

注:关于MySQL索引使用全程分析的内容就先介绍到这里,更多相关文章的可以留意

代码注释

作者:喵哥笔记

IDC笔记

学的不仅是技术,更是梦想!