Mysql索引降维 优化查询 提高效率

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: 数据的选择度越大,则维度越大。 降维,按我个人的理解是:在大量的数据中,一层一层地筛选过滤,维度也会逐渐减低。 点线面中,共有黑红两种颜色。 目标:筛选出所有红色的点 步骤:选出所有带有红色点的面 –> 选出所有带有红色点的线 –> 在线上选出所有红色点

写在前面


在前一篇文章中,我们已经介绍了索引、索引的优化规则等等 原文链接:mysql索引优化 在其中我们有引申出组合索引,多个单字段索引冲突两个知识点。 本文章主要是与后者有关联。 在原文中,我们使用了下面的例子


现在有这样子的数据量:
100W条数据 user_name=’我是用户名’
100条数据 user_phone=’110′
5条数据 user_name=’我是用户名’ and user_phone=’110′
假设有这样子一条语句:
select * from test where user_name = '我是用户名' and user_phone='110'
有两个字段都有索引可用,mysql会选择一个使用。这是属于mysql的内部处理判断
正常情况下,如果用user_phone索引生效的话,会很快得到结果(先筛选出100条 再筛选)
如果user_name生效,则要先筛选100W条数据,再筛选user_phone
mysql内部的错误判断可能使得user_name索引生效,此时效率就会很低了,我们可以强制使用某个索引


指定使用索引的意义


从以上例子中,我们可以思考并归纳。能提升效率的核心是:在一开始就尽可能地筛选出准确的数据。 所以当我们发现mysql可能处理出错的情况时,可以手动指定使用更优的索引来提高查询效率。 这个可以称为索引降维


降维


数据的选择度越大,则维度越大。 降维,按我个人的理解是:在大量的数据中,一层一层地筛选过滤,维度也会逐渐减低。 点线面中,共有黑红两种颜色。 目标:筛选出所有红色的点 步骤:选出所有带有红色点的面 –> 选出所有带有红色点的线 –> 在线上选出所有红色点


索引降维


在老旧的mysql版本中,where的条件顺序还会很大影响执行结果。 比如在上面的举例中,用条件语句来举例,而不是索引


select * from test where user_name = '我是用户名' and user_phone='110'
select * from test where user_phone='110' and user_name = '我是用户名'


这两个语句会出现上面索引冲突时 mysql没有使用更优索引的情况一样,第一条语句会先筛选出100W条数据,再筛选user_phone=110


然而在后续的mysql发展中,sql构造器优化器会自动帮我们排序执行,这种问题已不太需要人工去调整。


但是当我们建立组合索引的时候,则会根据我们的选择顺序来构建了。 比如有这么一个索引


index user_info (user_name, user_phone)


我们可以用大小分类的情况举例看一下


└名字一
└──user_phone 110
└──user_phone 120
└──user_phone 119
└名字二
└──user_phone 110
└──user_phone 120
└──user_phone 119
└名字三
└──user_phone 110
└──user_phone 120
└──user_phone 119


而如果我们把顺序调整成(user_phone, user_name) 那么就可以把组合索引看成


└─110
└──user_name 名字一
└──user_name 名字二
└──user_name 名字三
└─120
└──user_name 名字一
└──user_name 名字二
└──user_name 名字三
└─119
└──user_name 名字一
└──user_name 名字二
└──user_name 名字三


两种情况,都会在某些场景下有自己的优势,所以我们就需要结合自己的业务数据来进行选择啦。 用我们的老例子来说: 以名字来区分,第一次筛选出现100W条数据,然后再筛选手机号。 以手机号来区分,第一次筛选出现100条数据,然后再筛选用户名。 同样的情况还出现在分表中,用什么条件来分表也是极其重要的。 分表中,如果我们以订单的年份作为分表条件,想要搜索ID=3的会员在2019年某个月份日期的订单,那么我们需要先搜索2019年的表(一年的订单假设有100W条记录),然后再筛选用户ID和其他月份等条件。 如果我们以订单的年份+月份作为分表条件(只是举例,有很多分表条件可以决定),那么初步筛选的数据就会少了很多了,后续的筛选步骤也会更快完成。


总结


在分表、组合索引等等场景下,我们可以结合业务数据,进行降维的顺序思考,尽可能地在一开始就筛选出比较准确的数据,在后续的筛选中则只需要遍历检查很少的一部分数据,已达到提高查询效率的效果。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
6天前
|
存储 关系型数据库 MySQL
Mysql索引总结(1)
Mysql索引总结(1)
13 0
|
1天前
|
存储 关系型数据库 MySQL
MySQL 8 索引原理详细分析
了解索引的详细原则,不仅有助于优化,能把索引搞清楚的,面试中优势也会很突显。 关于数据库优化的话题,V哥觉得还有很多地方可以聊,如果你有兴趣,欢迎关注一起讨论。
MySQL 8 索引原理详细分析
|
1天前
|
SQL 关系型数据库 MySQL
【MySQL】:分组查询、排序查询、分页查询、以及执行顺序
【MySQL】:分组查询、排序查询、分页查询、以及执行顺序
13 0
|
2天前
|
SQL 分布式计算 关系型数据库
云原生数据仓库产品使用合集之可以把ADB MySQL湖仓版数据库做成页面查询的数据库吗
阿里云AnalyticDB提供了全面的数据导入、查询分析、数据管理、运维监控等功能,并通过扩展功能支持与AI平台集成、跨地域复制与联邦查询等高级应用场景,为企业构建实时、高效、可扩展的数据仓库解决方案。以下是对AnalyticDB产品使用合集的概述,包括数据导入、查询分析、数据管理、运维监控、扩展功能等方面。
|
4天前
|
SQL 关系型数据库 MySQL
【MySQL】SQL优化
【MySQL】SQL优化
|
4天前
|
关系型数据库 MySQL 数据挖掘
【MySQL】多表连接查询
【MySQL】多表连接查询
|
4天前
|
存储 关系型数据库 MySQL
{MySQL} 数据库约束& 表的关系& 新增&&删除& 修改& 查询
{MySQL} 数据库约束& 表的关系& 新增&&删除& 修改& 查询
14 0
|
6天前
|
SQL 关系型数据库 MySQL
不允许你不知道的 MySQL 优化实战(一)
不允许你不知道的 MySQL 优化实战(一)
12 2
|
8天前
|
SQL 存储 关系型数据库
MySQL Cluster集群安装及使用
MySQL Cluster集群安装及使用
|
12天前
|
关系型数据库 MySQL 数据库
《MySQL 简易速速上手小册》第1章:MySQL 基础和安装(2024 最新版)
《MySQL 简易速速上手小册》第1章:MySQL 基础和安装(2024 最新版)
36 4