手机
当前位置:查字典教程网 >编程开发 >mysql数据库 >MySQL索引使用全程分析
MySQL索引使用全程分析
摘要:创建2张用户表user、user2,表结构相同,但user表使用InnoDB存储引擎,而user2表则使用MyISAM存储引擎。复制代码代码...

创建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

图1

Explain Select * from user2 where id>100 G;

MySQL索引使用全程分析2

图2

User 表中的数据和 User2 表中的数据是一样的,索引结构也是一样的,只不过它们的存储引擎不同。在图1中,查询用到了PRIMARY主键索引,而查询优化器预估的结果大概在65954行左右(实际是131513);在图2中,查询却没有使用索引,而是全表扫描了,返回的预估结果在131608行(实际是131509)。

Explain Select * from user where id>100 and age>50 G;

MySQL索引使用全程分析3

图3

Explain Select * from user where id>100 and age=50 G;

MySQL索引使用全程分析4

图4

Explain Select * from user2 where id>100 and age>50 G;

MySQL索引使用全程分析5

图5

Explain Select * from user2 where id>100 and age=50 G;

MySQL索引使用全程分析6

图6

【MySQL索引使用全程分析】相关文章:

MySQL 的CASE WHEN 语句使用说明

MySQL中的SUM函数使用教程

MySQL简化输入小技巧

MySQL 编码机制

MySQL数据库存储引擎和分支现状分析

MySQL Replace INTO的使用

MySQL DBA 常用手册小结

MySQL JOIN之完全用法

MySQL 实用命令

mysql 索引分类以及用途分析

精品推荐
分类导航