MySQL索引簡單分析

創建2張用戶表user、user2,表結構相同,但user表使用InnoDB存儲引擎,而user2表則使用 MyISAM存儲引擎。 www.aiwalls.com  
 

— 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。 www.aiwalls.com  

 

<?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
 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *