Mysql 索引你了解多少?
时间:2022-05-07
本文章向大家介绍Mysql 索引你了解多少?,主要内容包括前言、测试问题、问题2、问题3、问题4、问题5、答案及解析、问题2、问题3、问题4、问题5、小结、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
前言
Mysql 的索引是我们常用的,但实际了解多少呢?下面通过几个案例小问题来测验下,后面会有答案及相关解释
测试问题
问题1
下面的索引适合这个查询吗?
CREATE INDEX tbl_idx ON tbl (date_column)
SELECT COUNT(*)
FROM tbl
WHERE EXTRACT(YEAR FROM date_column) = 2017
选项:
A 很适合 B 不适合
问题2
下面的索引适合这个查询吗?
CREATE INDEX tbl_idx ON tbl (a, date_column)
SELECT *
FROM tbl
WHERE a = 12
ORDER BY date_column DESC
LIMIT 1
选项:
A 很适合 B 不适合
问题3
下面的索引适合这两个查询吗?
CREATE INDEX tbl_idx ON tbl (a, b)
SELECT *
FROM tbl
WHERE a = 38
AND b = 1
SELECT *
FROM tbl
WHERE b = 1
选项:
A 很适合 B 不适合
问题4
下面的索引适合这个查询吗?
CREATE INDEX tbl_idx ON tbl (text)
SELECT *
FROM tbl
WHERE text LIKE 'TJ%'
选项:
A 很适合 B 不适合
问题5
先看下这个索引和查询
CREATE INDEX tbl_idx ON tbl (a, date_column)
SELECT date_column, count(*)
FROM tbl
WHERE a = 38
GROUP BY date_column
为了实现一个新的功能需求,会添加一个新的查询条件 b = 1
SELECT date_column, count(*)
FROM tbl
WHERE a = 38
AND b = 1
GROUP BY date_column
新的查询会如何影响性能?
选项:
A 两个查询的性能一致 B 无法判断,因为信息不足 C 第二个查询更慢了 D 第二个查询更快了
答案及解析
问题1
CREATE INDEX tbl_idx ON tbl (date_column)
SELECT COUNT(*)
FROM tbl
WHERE EXTRACT(YEAR FROM date_column) = 2017
答案 B 不适合
因为对索引列使用了函数,会使索引失效,使用下面的方式会更高效
SELECT COUNT(*)
FROM tbl
WHERE date_column >= DATE'2017-01-01'
AND date_column < DATE'2018-01-01'
问题2
CREATE INDEX tbl_idx ON tbl (a, date_column)
SELECT *
FROM tbl
WHERE a = 12
ORDER BY date_column DESC
LIMIT 1
答案 A 很适合
这个索引很好的支持了 where
和 order by
问题3
CREATE INDEX tbl_idx ON tbl (a, b)
SELECT *
FROM tbl
WHERE a = 38
AND b = 1
SELECT *
FROM tbl
WHERE b = 1
答案 B 不适合
索引只覆盖了第一个查询,第二个查询没能高效的使用索引
改变一下索引即可
CREATE INDEX tbl_idx ON tbl (b, a)
问题4
CREATE INDEX tbl_idx ON tbl (text)
SELECT *
FROM tbl
WHERE text LIKE 'TJ%'
答案 A 适合
LIKE
中虽然使用了 %
,但是在尾部,是可以应用索引的
问题5
CREATE INDEX tbl_idx ON tbl (a, date_column)
SELECT date_column, count(*)
FROM tbl
WHERE a = 38
GROUP BY date_column
SELECT date_column, count(*)
FROM tbl
WHERE a = 38
AND b = 1
GROUP BY date_column
答案 C 第二个查询更慢了
第一个查询只需要对索引进行扫描,因为 select, where, group by
中涉及的列都是索引中的,完全不需要访问实际的表,这种情况叫做索引覆盖
,性能是极好的
而第二个查询就需要访问实际的表,根据 b = 1
这个条件进行过滤
小结
上面是5个关于索引使用的小问题,比较简单,但也常被忽略,希望能对大家有点帮助
- 19.10 处理图形中的乱码
- 《深入理解C# 3.x的新特性》博文系列汇总
- 十一国庆节 之 “变量与函数同名时,会输出谁?”
- 挖坑无止境,来看看这个《this的指向》
- T-SQL Enhancement in SQL Server 2005[上篇]
- 初学js钻太深,不太好
- Linux shell 程序设计3——命令行程序
- Linux shell 程序设计2——bash的内置命令
- T-SQL Enhancement in SQL Server 2005[下篇]
- JS原型,a和b是不是失散多年的兄弟?
- Linux shell 程序设计1——安装及入门
- 偶遇--《坑新人--前端专用面试题》
- 简单的说下,(function(){...})() 与 (function(){...}()) 有什么区别?
- ASP.NET Process Model之二:ASP.NET Http Runtime Pipeline[上篇]
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解