文档章节

mysql索引分析

五大三粗
 五大三粗
发布于 2015/05/03 14:01
字数 442
阅读 21
收藏 0

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

© 著作权归作者所有

共有 人打赏支持
五大三粗
粉丝 159
博文 2247
码字总数 4666248
作品 0
广州
程序员
MySQL 索引选择原则分析(二)

2:MySQL索引选择规则(唯一索引查询) studentsorigin表中只有主键,没有建立索引。 select id, name from studentsorigin; 根据MySQL 索引选择原则分析(一)2.1来分析,所以只能是全表扫描...

tara_qri
2015/10/14
24
0
MySQL 索引选择原则

目的 MySQL查询优化器是基于代价(cost-based)的查询方式。因此,在查询过程中,最重要的一部分是根据查询的SQL语句,依据多种索引,计算查询需要的代价,从而选择最优的索引方式生成查询计...

tara_qri
2015/09/24
62
0
MySQL 索引选择原则

目的 MySQL查询优化器是基于代价(cost-based)的查询方式。因此,在查询过程中,最重要的一部分是根据查询的SQL语句,依据多种索引,计算查询需要的代价,从而选择最优的索引方式生成查询计...

真爱2015
2015/12/07
75
0
MySQL 索引选择原则分析(示例库)

目的 数据库中很重要的设计一部分,莫过于索引了。B+树索引是MySQL中设计的索引。B+树索引是基于B+树基础发展而来的。 前面文章MySQL 索引选择原则分析(一)已经对索引做进一步分析。但是实...

tara_qri
2015/10/18
65
0
性能优化案例分析之一:软删除是慢查询的罪魁祸首?

背景 在Rails项目里面,为了实现软删除,我们经常会使用 actsasparanoid 这个gem。它会给数据库表添加一个deletedat栏位,当删除数据时给这个栏位设置当前时间,查询数据时由于设置了 defaul...

quakewang
2017/11/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

redis-hash

哈希类型是指健值本身又是一个键值对结构 基本命令: hset key field value 设置值 hget(获取),hdel(删除),hlen(计算field个数),hmget(批量设置),hexists(是否存在),hkeys(获取所有的...

拐美人
16分钟前
1
0
简单的svm例子

数据来源:https://github.com/oumiga1314/Coursera-ML-AndrewNg-Notes/blob/master/code/ex6-SVM/data/ex6data1.mat import pandas as pd import numpy as np import scipy.io as sio impor......

南桥北木
20分钟前
0
0
android 关于View的一些整理

1、Button text的值为英文时,会自动转换成大写。如需取消,设置android:textAllCaps="false" 2、控件的可见性 可以在layout的配置文件中,配置android:visibility属性 调用setVisibility()...

西米小娅
30分钟前
0
0
Spring JDBC数据源分析

Spring数据源分析 分析这样一段代码: package com.jason.spring.datasource.jdbc;import org.springframework.context.support.ClassPathXmlApplicationContext;import org.springframew......

宸明
39分钟前
1
0
FatJar:适用于sdk多module打包和合并多个jar的gradle插件

usage: 1.下载fatJar.gradle放置于project根目录 2.在project的build.gradle中添加依赖和配置: apply from: 'fatJar.gradle'buildscript { dependencies { classpath 'xyz......

SuShine
55分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部