浅谈MySQL索引

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: “请你谈一下MYSQL的索引吧?”、“MYSQL索引规则是什么?”,相信小伙伴们也经常遇到这些方便问答,那么今天我也来浅谈一下MYSQL的索引,也希望能为你提供一些帮助。

1、什么是索引,什么时候需要使用索引?
索引是通过额外的空间来保存你需要快速查询的一些字段,将这些字段按照一定的顺序存储并与原始数据进行映射,这样如果你要查询这些字段就无需去查询原表(可以肯定的是索引表的数据量肯定比原表小)。索引是提高查询性能的最佳途径。
但是索引也有它适用的范围,通常对于可以预计是小表的话,我们不会去见索引会浪费空间;对于中表或者大表,通过建立合适的索引能够极大地提高查询速度;当然对于超大表,不建议建立索引,会浪费太多的存储空间,会有其他第三方支持,补充一点:对于超大表的话可以考虑用分区表。

2、B-Tree索引的查询类型?
MySQL数据库中最常用的引擎是InnoDB,一般来说索引的类型指明都是用B-Tree索引,该索引的特点有如下:
1)、匹配最左前缀:即最左边的列是要先匹配,才能匹配剩余的列。
2)、全值匹配
3)、范围匹配:当用了范围匹配,在之后的列将不再用索引了
4)、精确匹配某一列,并范围匹配另外一列:即将2、3结合
5)、只访问索引查询:这个特性也就是我们说的覆盖索引

3、InnoDB中无哈希索引,如何利用哈希索引?
在InnoDB中是不存在哈希索引,那么哈希索引又如何用,其实并不能叫做哈希索引,只是用哈希特性,本质上还是利用B-Tree索引。
通常的用法是:针对某个较长的字符串,比如存储了URL,值为:http://www.baidu.com,那么我们要对URL进行建立索引,如果直接建立的话,索引占用的空间太大,可以通过哈希函数(比如:crc32)将其值映射到一个固定长度的数值,将该列的值添加表中,并为该列创建索引。这里面会有一个问题,那就是可能会存在重复的哈希值。解决的办法:
1)、如果能够容忍重复的情况下,在查询where条件中,除了附加索引的列的值,还要添加url的值,当重复的时候,就会用url的值来去重。
2)、通过64位的哈希函数来减少重复的概率。
注意:针对长文本建立索引的时候,我们也可以考虑取长文本的前缀建立索引。

4、那些情况下创建的索引列不起作用?
索引列不起作用的情况:
1)、将所有列使用函数等条件,比如:
SELECT

num_id 

FROM

USER us 

WHERE

us.id + 1 = 5;//使用了加号

SELECT

userid 

FROM
USER
WHERE

TO_DAYS( CURRENT_DATE ) - TO_DAYS( query_date ) <= 10;

2)、范围查询之后的索引列不起作用
范围查询主要是指< 、>,以及like,注意:对于in 会转化多个等式,因此仍然可以。

5、多列索引中列的排序如何选择?
对于B-Tree的多列索引,采用的是最左列排序,即在设计多列索引的情况,应该将选择性最高的放到索引的最前列(好处是能够快速定位到具体的行,不然会存在很多重复的行)
一般选择的法则:经验法则,示例如下:
比如针对两个列:staff_id和cunstom_id列的选择,通过以下方法:
SELECT

COUNT( DISTINCT staff_id ) / COUNT( * ) AS staff_id_selectivity,
COUNT( DISTINCT custom_id ) / COUNT( * ) AS customer_id_selectivity,
COUNT( * ) 

FROM

payment;

如果确认custom_id比staff_id的选择性更高,则添加如下多列索引:
ALTER TABLE payment ADD KEY ( customer_id, staff_id );

6、MySQL中有序结果集生成的方式有哪些?索引在其中起什么作用?
两种方式:
1)、通过排序操作;
2)、按索引排序(如果Explain中的type:index说明是按索引排序)

7、什么是冗余索引?
比如创建了一个多列索引(A,B),再创建一个单列索引(A),此时单列索引就是冗余索引,因为这只是第一个索引的前缀索引;如果创建一个单列索引(B),则不是。
在创建索引中对于相同的列,我们可能会按照不同的顺序来创建索引来满足不同的业务需求。

8、范围条件IN和>、<在多列索引中使用的区别?
IN在索引中会转化为多个等式,而<、>不可以。

9、索引导致的性能缺点有哪些?
索引的问题:
1)、占用硬盘,mysql需要的时候会调入内存,但是如果太大仍然会有问题。
2)、导致插入、更新等操作变慢

10、选择索引和编写利用索引的查询,需要记住的三个原则:
1)、单行访问是很慢的
2)、按顺序访问范围数据是很快的
3)、索引覆盖查询是很快的

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
15天前
|
关系型数据库 MySQL 索引
mysql 分析5语句的优化--索引添加删除
mysql 分析5语句的优化--索引添加删除
12 0
|
21天前
|
存储 关系型数据库 MySQL
轻松入门MySQL:优化进销存管理,掌握MySQL索引,提升系统效率(11)
轻松入门MySQL:优化进销存管理,掌握MySQL索引,提升系统效率(11)
|
26天前
|
存储 自然语言处理 关系型数据库
ElasticSearch索引 和MySQL索引那个更高效实用那个更合适
ElasticSearch索引 和MySQL索引那个更高效实用那个更合适
37 0
|
27天前
|
SQL 存储 关系型数据库
MySQL not exists 真的不走索引么
MySQL not exists 真的不走索引么
24 0
|
30天前
|
SQL 存储 关系型数据库
对线面试官 - 如何理解MySQL的索引覆盖和索引下推
索引下推是MySQL 5.6引入的优化,允许部分WHERE条件在索引中处理,减少回表次数。例如,对于索引(zipcode, lastname, firstname),查询`WHERE zipcode=&#39;95054&#39; AND lastname LIKE &#39;%etrunia%&#39;`时,索引下推先过滤zipcode,然后在索引中应用lastname条件,降低回表需求。索引下推可在EXPLAIN的`Using index condition`中看到。
对线面试官 - 如何理解MySQL的索引覆盖和索引下推
|
1月前
|
监控 关系型数据库 MySQL
MySQL创建索引的注意事项
在数据库设计和优化中,索引的合理使用是提高查询性能和加速数据检索的关键因素之一。通过选择适当的列、了解数据分布、定期维护和监控索引性能,我们能够最大程度地发挥索引的优势,提高数据库的效率和响应速度。
29 0
|
1月前
|
关系型数据库 MySQL 数据库
MySQL索引和查询优化
MySQL索引和查询优化
35 1
|
1月前
|
SQL 关系型数据库 MySQL
MySQL索引与事务
MySQL索引与事务
101 0
|
1月前
|
监控 关系型数据库 MySQL
MySQL创建索引的注意事项
在索引的世界中,权衡是关键。权衡读写性能,权衡索引的数量和类型,权衡查询的频率和数据分布。通过谨慎的设计、定期的维护和持续的监控,我们能够确保索引在数据库中的角色得到最大的发挥,为应用提供更加高效和可靠的数据访问服务。在数据库优化的旅途中,索引是我们的得力助手,正确使用它将使数据库系统更具竞争力和可维护性。
18 0
|
1月前
|
存储 关系型数据库 MySQL
最全MySQL面试60题(含答案):存储引擎+数据库锁+索引+SQL优化等
最全MySQL面试60题(含答案):存储引擎+数据库锁+索引+SQL优化等
172 0