索引大小对语句执行速度的影响
先看下面这条语句:
mysql> select count(*) from search_hash;
+----------+
| count(*) |
+----------+
| 1665476 |
+----------+
1 row in set (0.53 sec)
哇,执行的速度非常快,100多万行只用了不到0.5秒。explian分析一下执行计划。
mysql> explain select count(*) from search_hash;
+----+-------------+-------------+-------+---------------+-----------+---------+------+---------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------------+-------+---------------+-----------+---------+------+---------+-------------+
| 1 | SIMPLE | search_hash | index | NULL | info_hash | 123 | NULL | 1670417 | Using index |
+----+-------------+-------------+-------+---------------+-----------+---------+------+---------+-------------+
这个表里有3条索引,我发现这条语句使用的是info_hash这条索引,为什么不用其他的索引呢?
mysql> show index from search_hash\G;
*************************** 1. row ***************************
Table: search_hash
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: id
Collation: A
Cardinality: 1670119
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
*************************** 2. row ***************************
Table: search_hash
Non_unique: 0
Key_name: info_hash
Seq_in_index: 1
Column_name: info_hash
Collation: A
Cardinality: 1670119
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: BTREE
Comment:
*************************** 3. row ***************************
Table: search_hash
Non_unique: 1
Key_name: ix_search_hash_name
Seq_in_index: 1
Column_name: name
Collation: A
Cardinality: 1670119
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: BTREE
Comment:
3 rows in set (0.02 sec)
然后我试一下使用主键索引的效果。
mysql> select count(0) from search_hash force index (primary);
+----------+
| count(0) |
+----------+
| 1665495 |
+----------+
1 row in set (4.63 sec)
。。。。速度马上下降了10倍!是什么原因呢?先看一下执行计划:
mysql> explain select count(*) from search_hash force index (primary);
+----+-------------+-------------+-------+---------------+---------+---------+------+---------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------------+-------+---------------+---------+---------+------+---------+-------------+
| 1 | SIMPLE | search_hash | index | NULL | PRIMARY | 4 | NULL | 1670477 | Using index |
+----+-------------+-------------+-------+---------------+---------+---------+------+---------+-------------+
跟第一条语句没有什么不同,除了使用的索引不一样。那这两索引有什么不同呢?
mysql> desc search_hash;
+-------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| info_hash | varchar(40) | YES | UNI | NULL | |
| name | varchar(200) | YES | MUL | NULL | |
+-------------+--------------+------+-----+---------+----------------+
是不是索引越大,就越慢呢?为此我又用name列上的索引测试一下。
mysql> select count(*) from search_hash force index (ix_search_hash_name);
+----------+
| count(*) |
+----------+
| 1665690 |
+----------+
1 row in set (0.94 sec)
name列上的索引比infor_hash大,执行的时间也相对长一些。那有人可能会说id列长度明明小于info_hash列啊,为什么执行时间最长?
id列上的索引是主键索引,同时也是聚族索引,它包含了所有的列,所以三个索引中主键索引的体积是最大的,执行的时间也就最长。
总结:
1.同等情况下,索引的体积越大,可能执行的时间也就越长。
2.mysql优化器挺智能的嘛!
转载于:https://www.cnblogs.com/ayard/p/9239238.html
索引大小对语句执行速度的影响相关推荐
- iar代码优化影响运行速度吗_IAR中优化等级对Kinetis FGPIO执行速度的影响
在灯光控制.IO模拟Flex Bus等很多应用中,对GPIO的翻转速度有很高的要求,M0+内核中集成了一个特定的single-cycle I/O port,Kinetis中我们称之为Fast GPIO ...
- sql语句分析是否走索引_mysql sql语句执行时是否使用索引检查方法
在日常开发中,使用到的数据表经常都会有索引,这些索引可能是开发人员/DBA建表时创建的,也可能是在使用过程中新增的.合理的使用索引,可以加快数据库查询速度.然而,在实际开发工作中,会出现有些sql语句 ...
- 关于加快INSERT语句执行速度和 HINT /*+ append*/及nologging的使用
(非归档模式下)创建表T01: SQL> create table t01 as select * from dba_objects where 1=2; Table created. (非归档 ...
- SGA大小对rman备份速度的影响基本是零
SGA 设置成100G的时候 SQL> show sgaTotal System Global Area 1.0689E+11 bytes Fixed Size 2265864 bytes Va ...
- SQL查询语句执行顺序详解
查询操作是关系数据库中使用最为频繁的操作,也是构成其他SQL语句(如DELETE.UPDATE)的基础.当要删除或更新某些记录时,首先要查询出这些记录,然后再对其进行相应的SQL操作.因此基于SELE ...
- 数据库索引--SQL语句执行效率、分析及优化
数据库表中字段上创建的索引,在写SQL语句进行查询时,索引可能会被使用到,也肯能因为SQL语句导致索引在此条SQL语句执行时索引无效. 聚簇索引的顺序就是数据的物理存储顺序,而对非聚簇索引的解释是:索 ...
- oracle查看执行最慢与查询次数最多的sql语句及其执行速度很慢的问题分析
oracle查看执行最慢与查询次数最多的sql语句 注:本文来源 于<oracle查看执行最慢与查询次数最多的sql语句> 前言 在ORACLE数据库应用调优中,一个SQL的执行次数/频率 ...
- oracle一条sql运行时间很长,oracle查看执行最慢与查询次数最多的sql语句及其执行速度很慢的问题分析...
oracle查看执行最慢与查询次数最多的sql语句 前言 在ORACLE数据库应用调优中,一个SQL的执行次数/频率也是常常需要关注的,因为某个SQL执行太频繁,要么是由于应用设计有缺陷,需要在业务逻 ...
- mysql一条语句是如何被执行的——带你了解mysql语句执行内部顺序
文章目录 写在前面 MySQL基本架构 超详细架构图 连接器 查询缓存 解析器 MySQL 8.0对Parser所做的改进 优化器 执行器 存储引擎 SQL语句执行时间分析 参考资料 写在前面 sel ...
- 详解MySQL的逻辑架构和SQL语句执行流程
文章目录 1. 逻辑架构 1.1 连接层 1.2 服务层 1.3 引擎层 1.3.1 InnoDB 存储引擎 1.3.2 MyISAM 存储引擎 1.3.3 其他存储引擎 1.4 存储层 3. SQL ...
最新文章
- php检测类是否存在,php判断类是否存在函数class_exists用法分析
- [译] 理解编译器 —— 从人类的角度(版本 2)
- Android线程优先级设置方法技巧
- C++对C的加强之新增Bool类型关键字
- 技术人生“白天求生存,晚上谋发展”
- kappa和lambda对比 | 程序员硬核评测
- python安装目录结构_python软件目录结构规范
- canvas绘制竖排的数字_大佬教你用Python Tkinter实现数字猜谜小游戏
- 【Flink】Flink 报错 ResourceManager leader changed to new address null
- MySQL用户管理和权限设置
- 6-4 开班简介1
- 对+=赋值运算符的认识
- 庞皓计量经济学第四版_庞皓计量经济学第4版笔记和课后答案
- 计算机组装内存条安装,笔记本电脑内存条的正确安装方法
- Excel中的数字转文本和文本转数字
- 【集训队互测】ayq 三道题
- 如何分分钟成为Java嵌入式开发人员
- 《滕王阁序》本周部分GAN论文(0113-0117)
- 软件生存周期、项目生命周期、产品生命周期区别
- 【MySQL】练习二 关系数据库
热门文章
- 性能测试二八原则,响应时间2/5/8原则
- 如何动态读取嵌入式资源
- mysql主从数据库服务器搭建
- 不同语言Sql Server的库交换出现乱码
- 如何保护开发人员工作站
- win10连接mq_Win10环境下配置RocketMQ
- 2021高考成绩已出城市查询,2021年青海高考成绩什么时候出来 公布时间
- 用python做文件处理_用Python实现文件处理
- java: 非法字符: ‘\ufeff‘、java: 需要class, interface或enum
- java 占位符_Java重要知识点