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--索引和优化》

posted @ 2012-10-24 21:46  Old  阅读(575)  评论(0编辑  收藏  举报