先看下面这条语句:
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

索引大小对语句执行速度的影响相关推荐

  1. iar代码优化影响运行速度吗_IAR中优化等级对Kinetis FGPIO执行速度的影响

    在灯光控制.IO模拟Flex Bus等很多应用中,对GPIO的翻转速度有很高的要求,M0+内核中集成了一个特定的single-cycle I/O port,Kinetis中我们称之为Fast GPIO ...

  2. sql语句分析是否走索引_mysql sql语句执行时是否使用索引检查方法

    在日常开发中,使用到的数据表经常都会有索引,这些索引可能是开发人员/DBA建表时创建的,也可能是在使用过程中新增的.合理的使用索引,可以加快数据库查询速度.然而,在实际开发工作中,会出现有些sql语句 ...

  3. 关于加快INSERT语句执行速度和 HINT /*+ append*/及nologging的使用

    (非归档模式下)创建表T01: SQL> create table t01 as select * from dba_objects where 1=2; Table created. (非归档 ...

  4. SGA大小对rman备份速度的影响基本是零

    SGA 设置成100G的时候 SQL> show sgaTotal System Global Area 1.0689E+11 bytes Fixed Size 2265864 bytes Va ...

  5. SQL查询语句执行顺序详解

    查询操作是关系数据库中使用最为频繁的操作,也是构成其他SQL语句(如DELETE.UPDATE)的基础.当要删除或更新某些记录时,首先要查询出这些记录,然后再对其进行相应的SQL操作.因此基于SELE ...

  6. 数据库索引--SQL语句执行效率、分析及优化

    数据库表中字段上创建的索引,在写SQL语句进行查询时,索引可能会被使用到,也肯能因为SQL语句导致索引在此条SQL语句执行时索引无效. 聚簇索引的顺序就是数据的物理存储顺序,而对非聚簇索引的解释是:索 ...

  7. oracle查看执行最慢与查询次数最多的sql语句及其执行速度很慢的问题分析

    oracle查看执行最慢与查询次数最多的sql语句 注:本文来源 于<oracle查看执行最慢与查询次数最多的sql语句> 前言 在ORACLE数据库应用调优中,一个SQL的执行次数/频率 ...

  8. oracle一条sql运行时间很长,oracle查看执行最慢与查询次数最多的sql语句及其执行速度很慢的问题分析...

    oracle查看执行最慢与查询次数最多的sql语句 前言 在ORACLE数据库应用调优中,一个SQL的执行次数/频率也是常常需要关注的,因为某个SQL执行太频繁,要么是由于应用设计有缺陷,需要在业务逻 ...

  9. mysql一条语句是如何被执行的——带你了解mysql语句执行内部顺序

    文章目录 写在前面 MySQL基本架构 超详细架构图 连接器 查询缓存 解析器 MySQL 8.0对Parser所做的改进 优化器 执行器 存储引擎 SQL语句执行时间分析 参考资料 写在前面 sel ...

  10. 详解MySQL的逻辑架构和SQL语句执行流程

    文章目录 1. 逻辑架构 1.1 连接层 1.2 服务层 1.3 引擎层 1.3.1 InnoDB 存储引擎 1.3.2 MyISAM 存储引擎 1.3.3 其他存储引擎 1.4 存储层 3. SQL ...

最新文章

  1. php检测类是否存在,php判断类是否存在函数class_exists用法分析
  2. [译] 理解编译器 —— 从人类的角度(版本 2)
  3. Android线程优先级设置方法技巧
  4. C++对C的加强之新增Bool类型关键字
  5. 技术人生“白天求生存,晚上谋发展”
  6. kappa和lambda对比 | 程序员硬核评测
  7. python安装目录结构_python软件目录结构规范
  8. canvas绘制竖排的数字_大佬教你用Python Tkinter实现数字猜谜小游戏
  9. 【Flink】Flink 报错 ResourceManager leader changed to new address null
  10. MySQL用户管理和权限设置
  11. 6-4 开班简介1
  12. 对+=赋值运算符的认识
  13. 庞皓计量经济学第四版_庞皓计量经济学第4版笔记和课后答案
  14. 计算机组装内存条安装,笔记本电脑内存条的正确安装方法
  15. Excel中的数字转文本和文本转数字
  16. 【集训队互测】ayq 三道题
  17. 如何分分钟成为Java嵌入式开发人员
  18. 《滕王阁序》本周部分GAN论文(0113-0117)
  19. 软件生存周期、项目生命周期、产品生命周期区别
  20. 【MySQL】练习二 关系数据库

热门文章

  1. 性能测试二八原则,响应时间2/5/8原则
  2. 如何动态读取嵌入式资源
  3. mysql主从数据库服务器搭建
  4. 不同语言Sql Server的库交换出现乱码
  5. 如何保护开发人员工作站
  6. win10连接mq_Win10环境下配置RocketMQ
  7. 2021高考成绩已出城市查询,2021年青海高考成绩什么时候出来 公布时间
  8. 用python做文件处理_用Python实现文件处理
  9. java: 非法字符: ‘\ufeff‘、java: 需要class, interface或enum
  10. java 占位符_Java重要知识点