oracle 5种索引方式,MySQL使用索引的几种方式
MySQL使用索引的几种方式
之前的blog有介绍令人迷糊的extra中信息,本文我们重点来看看当执行计划使用索引的时候
extra中几种显示的场景
版本:Mysql 5.6.14
测试表结构如下:
CREATE TABLE `snapshot` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`snap_id` int(11) DEFAULT NULL,
`name` varchar(500) DEFAULT NULL,
`value` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `snap_id_ix` (`snap_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
在snap_id上创建了索引,然后插入一些测试数据。
1,snap_id为等于的操作
mysql> explain extended select * from snapshot where snap_id=10;
+----+-------------+----------+------+---------------+------------+---------+-------+------+----------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+----------+------+---------------+------------+---------+-------+------+----------+-------+
| 1 | SIMPLE | snapshot | ref | snap_id_ix | snap_id_ix | 5 | const | 1 | 100.00 | NULL |
+----+-------------+----------+------+---------------+------------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)
这个虽然使用了索引,但是extra中没有任何信息,显示为空
2,使用索引条件,先扫描索引,然后再通过索引扫描表
mysql> explain extended select * from snapshot where snap_id<100;
+----+-------------+----------+-------+---------------+------------+---------+------+------+----------+-----------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+----------+-------+---------------+------------+---------+------+------+----------+-----------------------+
| 1 | SIMPLE | snapshot | range | snap_id_ix | snap_id_ix | 5 | NULL | 1 | 100.00 | Using index condition |
+----+-------------+----------+-------+---------------+------------+---------+------+------+----------+-----------------------+
1 row in set, 1 warning (0.00 sec)
通过索引条件,然后扫描表数据,extra是Using index condition
3,使用cover index,只查索引中的列,直接从索引中返回数据就可以了
mysql> explain extended select snap_id from snapshot;
+----+-------------+----------+-------+---------------+------------+---------+------+------+----------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+----------+-------+---------------+------------+---------+------+------+----------+-------------+
| 1 | SIMPLE | snapshot | index | NULL | snap_id_ix | 5 | NULL | 6415 | 100.00 | Using index |
+----+-------------+----------+-------+---------------+------------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)
mysql> explain extended select snap_id from snapshot where snap_id=10;
+----+-------------+----------+------+---------------+------------+---------+-------+------+----------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+----------+------+---------------+------------+---------+-------+------+----------+-------------+
| 1 | SIMPLE | snapshot | ref | snap_id_ix | snap_id_ix | 5 | const | 1 | 100.00 | Using index |
+----+-------------+----------+------+---------------+------------+---------+-------+------+----------+-------------+
1 row in set, 1 warning (0.01 sec)
mysql> explain extended select snap_id from snapshot where snap_id>10;
+----+-------------+----------+-------+---------------+------------+---------+------+------+----------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+----------+-------+---------------+------------+---------+------+------+----------+--------------------------+
| 1 | SIMPLE | snapshot | range | snap_id_ix | snap_id_ix | 5 | NULL | 6367 | 100.00 | Using where; Using index |
+----+-------------+----------+-------+---------------+------------+---------+------+------+----------+--------------------------+
1 row in set, 1 warning (0.00 sec)
在extra出现的是Using index提示,表明只使用索引即可,不需要对表进行扫描操作.
4, 接下来我们看连接的操作,假设为snapshot作为连接的内表
mysql> explain
-> select *
-> from t1 join snapshot
-> on (t1.a=snapshot.snap_id)
-> ;
+----+-------------+----------+------+---------------+------------+---------+----------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+------+---------------+------------+---------+----------+------+-------+
| 1 | SIMPLE | t1 | ALL | PRIMARY | NULL | NULL | NULL | 3 | NULL |
| 1 | SIMPLE | snapshot | ref | snap_id_ix | snap_id_ix | 5 | db1.t1.a | 200 | NULL |
+----+-------------+----------+------+---------------+------------+---------+----------+------+-------+
2 rows in set (0.00 sec)
通过执行计划可以看出对snapshot也是索引来访问的,外表传过来的值,在内表很类似于snap_id=XX,所以和第1中的执行
计划很类似.除ref之外,一个是来自于常量(const),而本例中是来自表t1的索引db.t1.a.
oracle 5种索引方式,MySQL使用索引的几种方式相关推荐
- mysql安装文件格式_一、安装方式 MySQL安装文件分为两种,一种是MSI格式的,一种是ZIP格式的。下面来看看这两种方式: MSI格式的可以直接点击安...
一.安装方式 MySQL安装文件分为两种,一种是MSI格式的,一种是ZIP格式的.下面来看看这两种方式: MSI格式的可以直接点击安装,按照它给出的安装提示进行安装,Windows操作系统下一般MyS ...
- 什么是索引?Mysql目前主要的几种索引类型 和 引擎区别?
一.索引 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的My ...
- mysql 索引类型 ref_什么是索引?Mysql目前主要的几种索引类型
一.索引 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的My ...
- MySQL索引,MySQL中索引的限制?
MySQL中索引的限制: 1.MyISAM存储引擎引键的长度综合不能超过1000字节: 2.BLOB和TEXT类型的列只能创建前缀索引: 3.MySQL目前不支持函数索引: 4.使用!= 或者< ...
- 【mysql 索引】mysql 添加索引
主要内容: 1.什么是索引 2.添加索引sql 3.索引所用的算法 4.补充下概念 5.索引的缺点 6.经典案例 一.什么是索引? 索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树 ...
- SQL Server中的联合主键、聚集索引、非聚集索引、mysql 联合索引
我们都知道在一个表中当需要2列以上才能确定记录的唯一性的时候,就需要用到联合主键,当建立联合主键以后,在查询数据的时候性能就会有很大的提升,不过并不是对联合主键的任何列单独查询的时候性能都会提升,但我 ...
- 什么是mysql的索引_什么是索引?mysql目前索引有哪些?
1.索引由数据库中一列或多列组合而成,其作用是提高对表中数据的查询速度. 索引的优点是可以提高检索数据的速度 索引的缺点是创建和维护索引需要耗费时间. 索引可以提高查询速度,会减慢写入速度. 2.索引 ...
- mysql 复合索引 in,MySQL复合索引比主键索引还快,为什么?
存储引擎:innodb 题目如下: create table t( id primary, ver int, content varchar(3000), intro varchar(3000) ) ...
- mysql 索引 fulltext,MySQL FULLTEXT索引问题
I'm trying to create a FULLTEXT index on an attribute of a table. Mysql returns ERROR 1214: The used ...
最新文章
- 程序人生系列谈:《程序员》带给我的启发故事
- ROS知识【13】:ubuntu下安装eclipse-CDT【非installor】
- ue4怎么导出fbx文件_【教程】Houdini Engine在UE4中的基本使用(一)
- Sentinel 规则持久化到 apollo 配置中心
- 洛谷 P2286 [HNOI2004]宠物收养场
- 【NOIP2017】【Luogu3954】成绩(模拟)
- 身在旋涡中的百度外卖,还能否找到接盘者?
- javaweb基于SSM酒店入住管理系统设计与实现(含毕业论文、程序设计及数据库文件)
- MIUI 13 去除输入法广告
- vue2 动态添加响应式数据
- Chrome 优化指南
- 计算机科班比其他专业有多少优势呢?
- 扎克伯格的智能管家计划 需面临哪些挑战
- 转录组分析---Hisat2+StringTie+Ballgown使用
- python数字转字符串_字符串转换与格式化
- 给服务器写一个简单的断网重连shell脚本
- 日期选择器(年、季、月、周)展示
- 【Proteus仿真】步进电机转速数码管显示
- 差分信号、共模信号、单端信号异同 (2022.2.14)
- pyinstaller使用多帧ICO图标
热门文章
- best introduction to camera calibration
- 使用FtpWebRequest 类操作(上传、下载和删除)FTP上的XML文件
- C#中的代理(Delegate)
- 十分钟玩转 jQuery、实例大全
- 一个类型初始值设定项引发异常
- 解决IDEA2020控制台乱码的方法(亲测)
- 一个关于php使用pdo方式进行数据库连接和处理的类
- Vue报错bash: vue: command not found或者vue ui没有反应:官方修改成新的命令了
- PHP的魔术常量魔术方法超全局变量
- PHP的xdebug五个按钮的说明