MySQL索引如何使用全程分析

往前走,一片诱人的新绿尽收眼底,那是满池的新荷。荷叶有的平展着圆盘浮在水面上;有的绿伞般在空中摇曳;有的兜着水珠把阳光反射得灿烂夺目;有的长得非常高,却未展开叶面,勇敢地挺立着。荷花则多半含苞待放,白中透粉的一朵朵花儿,活像一个个花仙子借着微风,在池中裙袂飞扬,翩然起舞。
创建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;

图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索引如何使用全程分析。许多找借口的人,在享受了借口带来的短暂快乐后,起初有点自责,多多少少有点骗人的味道。可是重复的次数一多,也就变得无所谓了,原本有点良知的心变得麻木不仁。其实,正是借口绊住了前进的脚步,迷惑了原本聪慧的头脑,让成功离你而去。更多关于MySQL索引如何使用全程分析请关注haodaima.com其它相关文章!

您可能有感兴趣的文章
centos7 mysql5.7主从同步配置

centos7安装MySQL教程

达梦数据库DM8表空间管理之删除表空间

达梦数据库DM8表空间管理之创建表空间

国产达梦数据库常用SQL语句(上)