源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

MySQL索引使用全程分析

  • 时间:2022-09-03 09:45 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:MySQL索引使用全程分析
创建2张用户表user、user2,表结构相同,但user表使用InnoDB存储引擎,而user2表则使用 MyISAM存储引擎。
[u]复制代码[/u] 代码如下:
-- 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。
[u]复制代码[/u] 代码如下:
<?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'; ?>
[b]对索引的使用分析[/b] Explain Select * from user where id>100 \G; [img]http://files.jb51.net/file_images/article/201211/2012111209492734.jpg[/img]   图1 Explain Select * from user2 where id>100 \G; [img]http://files.jb51.net/file_images/article/201211/2012111209492735.jpg[/img]   图2 User 表中的数据和 User2 表中的数据是一样的,索引结构也是一样的,只不过它们的存储引擎不同。在图1中,查询用到了PRIMARY主键索引,而查询优化器预估的结果大概在65954行左右(实际是131513);在图2中,查询却没有使用索引,而是全表扫描了,返回的预估结果在131608行(实际是131509)。 Explain Select * from user where id>100 and age>50 \G; [img]http://files.jb51.net/file_images/article/201211/2012111209492736.jpg[/img]   图3 Explain Select * from user where id>100 and age=50 \G; [img]http://files.jb51.net/file_images/article/201211/2012111209492737.jpg[/img]   图4 Explain Select * from user2 where id>100 and age>50 \G; [img]http://files.jb51.net/file_images/article/201211/2012111209492738.jpg[/img]   图5 Explain Select * from user2 where id>100 and age=50 \G; [img]http://files.jb51.net/file_images/article/201211/2012111209492739.jpg[/img]   图6
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部