mysql优化 explain index
本文章属于转载,尊重原创:http://www.2cto.com/database/201501/369135.html
实验环境:
| 1、sql工具:Navicat 2、sql数据库,使用openstack数据库作为示例 |
一、mysql索引查询
| show index from instances |
结果字段解释:
vcmRlcj0="1" cellpadding="2" cellspacing="0">
|
Table:数据库表名 Non_unique:索引不能包括重复词,则为0。可以,则为1。 Key_name:索引的名称。 索引中的列序列号,从1开始。 列名称 列以什么方式存储在索引中。在MySQL中,有值‘A’(升序)或NULL(无分类)。 索引中唯一值的数目的估计值。通过运行ANALYZE TABLE或myisamchk -a可以更新。基数根据被存储为整数的统计数据来计数,所以即使对于小型表,该值也没有必要是精确的。基数越大,当进行联合时,MySQL使用该索引的机 会就越大。 如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为NULL。 指示关键字如何被压缩。如果没有被压缩,则为NULL。 如果列含有NULL,则为YES。如果没有,则该列为NO。 用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)。 Comment:注释。 |
二、验证Mysql的主键会自动创建索引? 创建一个没有主键的ttx_index数据库表:
查询索引:
结果显示没有索引。
改变ttx_index数据库表字段id,将之设为主键,再次查询索引:

得出结论,在Mysql中,数据库主键会自动建立索引。
三、Mysql性能优化利器:explain 1、首先查看instances数据库表的索引:
2、EXPLAIN 用法详解:
| EXPLAIN SELECT * FROM instances |

根据上述结果,可以此查询花了0.027ms,没有可用的索引。
explain字段详解:
|
table:显示这一行的数据是关于哪张表的 type:这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALL possible_keys:显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句 key: 实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MYSQL忽略索引 key_len:使用的索引的长度。在不损失精确性的情况下,长度越短越好 ref:显示索引的哪一列被使用了,如果可能的话,是一个常数 rows:MYSQL认为必须检查的用来返回请求数据的行数 Extra:关于MYSQL如何解析查询的额外信息。将在下表中讨论,但这里可以看到的坏的例子是Using temporary和Using filesort,意思MYSQL根本不能使用索引,结果是检索会很慢 extra列返回的描述的意义:
|
那么如何才能让sql走索引查询呢?
| EXPLAIN SELECT * FROM instances WHERE id=1 |
从上图可以,该sql语句走了索引。因为该表中id为主键,mysql会自动创建索引,因此当将id作为where条件查询时,数据库会自动走索引。
接下来实验,当不走索引还是查询id=1这条数据时候,会是如何?
| SELECT id, display_name FROM instances WHERE id=1 |
| EXPLAIN SELECT * FROM instances WHERE display_name = "vm1" |

结论:在查询时候,如果where条件中的字段有索引(走不走索引,取决于where条件中的字段),在执行sql语句时,mysql会自动走索引。
但是有个问题是,在走不走索引,查询花费时间都是0.001ms,似乎没有得到性能提高?
| SELECT COUNT(*) FROM instances |
在数据库表中instance数据总条数才74条,因此索引没法发挥它的性能优势,接下来人为制造上w条数据:
| insert instances(display_name) select display_name from instances |
注:上述语句,可用来为数据库表指数形式插入新数据。
再次查询总条数:
| SELECT COUNT(*) FROM instances |
这次数据已经有接近500w了。 再次验证上述索引性能问题:
1、为了对比的真实性,将id=1的数据记录的display_name修改为唯一名字test_index_dispaly_name
| SELECT id, display_name FROM instances WHERE id=1 |
2、不走索引查询:
| SELECT * FROM instances WHERE display_name = 'test_index_dispaly_name' |
3、通过id走索引查询:
| SELECT * FROM instances WHERE id=1 |
结论:对于百万上亿级数据,走不走索引效率影响相当明显(效率差别都到万了)。
4、哪些情况sql不会走索引?
|
时间关系,此处暂且未总结,后续有时间补上。若有需要请自行网上查找。 |
mysql优化 explain index的更多相关文章
- 一次浴火重生的MySQL优化(EXPLAIN命令详解)
一直对SQL优化的技能心存无限的向往,之前面试的时候有很多面试官都会来一句,你会优化吗?我说我不太会,这时可能很多人就会有点儿说法了,比如会说不要使用通配符*去检索表.给常常使用的列建立索引.还有创建 ...
- mysql优化:explain分析sql语句执行效率
Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看SQL语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优 ...
- mysql优化——explain详解
MySQL的EXPLAIN命令用于SQL语句的查询执行计划(QEP).这条命令的输出结果能够让我们了解MySQL 优化器是如何执行SQL 语句的.这条命令并没有提供任何调整建议,但它能够提供重要的信息 ...
- mysql优化--explain关键字
MySQL性能优化---EXPLAIN 参见:https://blog.csdn.net/jiadajing267/article/details/81269067 参见:https://www.cn ...
- mysql优化–explain分析sql语句执行效率
Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看SQL语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优 ...
- MySQL优化Explain命令简介(一)
最近碰到MySQL需要写入大量数据并查询的场景,于是学习了一下MySQL的查询优化,想找关于explain命令的详细资料,然而网上并没有找全,最后终于在<高性能MySQL>中找到了对这一命 ...
- MySQL 优化之 index merge(索引合并)
深入理解 index merge 是使用索引进行优化的重要基础之一.理解了 index merge 技术,我们才知道应该如何在表上建立索引. 1. 为什么会有index merge 我们的 where ...
- MySQL优化Explain命令简介(二)
type列 MySQL手册上注明type列用于描述join type,不过我们认为把这一列视为对access type--即MySQL决定如何在表中寻找数据的方式的描述,更加合适一些,以下所示从最坏情 ...
- mysql优化----explain的列分析
sql语句优化: : sql语句的时间花在哪儿? 答: 等待时间 , 执行时间. 等待时间:看是不是被锁住了,那就不是语句层面了是服务端层面了,看连接数内存. 执行时间:到底取出多少行,一次性取出1万 ...
随机推荐
- QFileDialog关于选择文件对话框中的几个信号的说明(currentChanged,directoryEntered,fileSelected,filterSelected)
QFileDialog关于选择文件对话框中的几个信号 实例: openFile::openFile(QWidget *parent) :QWidget(parent),ui(new Ui::openF ...
- python 46 css组合选择器 及优先级 、属性选择器
一:css组合选择器 特性:每个选择器位可以为任意基本选择器或选择器组合 选择器分为以下几类: 群组选择器,子代(后代)选择器,相邻(兄弟)选择器,交集选择器,多类名选择器 1.群组选择器: d ...
- java多线程编程之synchronized
synchronized是用来解决多线程情况下的线程安全问题的,它可以修饰方法也可以修饰语句块 , 那么什么情况下是线程安全和线程不安全呢 ? 方法内的变量是线程安全的 , 类的实例变量是非线程安全的 ...
- js动态追加的元素如何触发事件
一般通过js或者jQuery动态添加的元素标签,通过该元素标签.class.id触发事件,是无效的.如下所示: <body> <input type="text" ...
- SQLServer In和Exists
In Exists () 1分42秒 5秒 Exists() 返回布尔值 如果子查询结果行>0,则返回 TRUE. 反之返回FALSE exists(select * fro ...
- Windows phone开发数据绑定系列(1)--了解数据绑定
(部分内容参考MSDN文档) 数据绑定是在应用程序UI与业务逻辑之间建立连接的过程.通过数据绑定的方式实现了后台数据和前台UI元素的关联, 为用户提供了更好地交互体验. 数据绑定一般有以下几种体现方式 ...
- java Queue中 remove/poll, add/offer, element/peek区别
offer,add区别: 一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝. 这时新的 offer 方法就可以起作用了.它不是对调用 add() 方法抛出一个 unche ...
- HTML链接用法
1.链接的打开方式 ①在新页面打开 <a href="www.baidu.com" target="_blank">百度一下</a> ② ...
- Linux通信之异步通知模式
[参考]韦东山 教学笔记 为了使设备支持异步通知机制,驱动程序中涉及以下3项工作:1. 支持F_SETOWN命令,能在这个控制命令处理中设置filp->f_owner为对应进程ID. 不过此项工 ...
- “发布后tomcat中的classes目录为空”问题
办法:Project-clean,ok,问题解决.