深入浅出MySQL(十)关于mysql查询的一些优化技巧

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: 深入浅出MySQL(十)关于mysql查询的一些优化技巧

EXPLAIN


先是最简单的一个分析:


EXPLAIN(SELECT admin_name FROM w_admin )


网络异常,图片无法展示
|


这里面显示了查询类型select_type为简单查询,type指的是字段,possible_keys是指使用了哪个索引来进行搜索,key是指mysql实际使用的索引,key_len是指响应索引的长度,ref是指链接的匹配条件(例如外键查询):rows是指mysql根据统计信息以及索引选用的情况。


例如这样一条关于管理员角色分配查询的sql语句。


网络异常,图片无法展示
|


in查询里面不要包含太多的字段内容:


in实际上是用了数组来存储里面的字段信息的,如果这些数字都是连续的话,就建议不要用in了,用between会好些。


执行select语句的时候,尽量指明字段名称


减少网络的io耗损


当查询数据只有一条的时候,尽量使用limit 1


这是为了能够使得EXPLAIN中的type列达到const类型


如果说sql语句进行排序的时候,尽量使得排序的关键字是索引字段


如果限制条件中其他字段没有使用到索引,则尽量少用or


通常会用union all或者union来替代


union和union all的使用区别


前者在进行数据整合的时候会进行去重和重新排序,因此会消耗较多的cpu性能,所以使用的时候需要谨慎。(UNION ALL 查询的时候没有去重,所以可能会查询出来多余部分的数据)


随机查询的实现技巧


SELECT * from w_article ORDER BY RAND() limit 10


这种方式实现的随机查询一般性能消耗会比较大,不妨试试用limit来进行优化,limit的开始位置通过java或者php代码,传入相应的参数来进行设置。


常用的查询关键字 in和exists的区别?


两种关键字驱动的查询顺序有所不同,这也是性能变化的关键之处。


exists:外表驱动

in:内表驱动,先进行子查询

优化可以考虑:

原SQL语句:


select colname … from A表 where a.id not in (select b.id from B表)

高效的SQL语句:


select colname … from A表 Left join B表 on where a.id = b.id where b.id is null

合理高效的分页技巧:


通过一些limit来进行分页的话,当数据量增大的时候,查询会越来越慢。

不妨可以通过相应的id来进行起始点优化性能。不过这招很不靠谱。


尽量在where字句中用到null值,因为这样会放弃使用全表查询

不建议使用%前缀模糊查询


例如LIKE“%name”或者LIKE“%name%”,这种查询会导致索引失效而进行全表扫描。但是可以使用LIKE “name%”。


那如何查询%name%?


如下图所示,虽然给secret字段添加了索引,但在explain结果并没有使用:

那么如何解决这个问题呢,答案:使用全文索引。


在我们查询中经常会用到select id,fnum,fdst from dynamic_201606 where user_name like ‘%zhangsan%’; 。这样的语句,普通索引是无法满足查询需求的。庆幸的是在MySQL中,有全文索引来帮助我们。(但是全文索引只在MYISAM里能被支持)

创建全文索引的SQL语法是:


ALTER TABLE dynamic_201606 ADD FULLTEXT INDEX idx_user_name (user_name);


使用全文索引的SQL语句是:


select id,fnum,fdst from dynamic_201606 where match(user_name) against(‘zhangsan’ in boolean mode);


注意:在需要创建全文索引之前,请联系DBA确定能否创建。同时需要注意的是查询语句的写法与普通索引的区别。


在where字句中尽量少些一些对于字段的表达式操作,容易造成数据库引擎放弃索引的操作


举个例子来说:


select user_id,user_project from user_base where age*2=36;
复制代码


中对字段就行了算术运算,这会造成引擎放弃使用索引,建议改成:


select user_id,user_project from user_base where age=36/2;
复制代码


对于联合索引来说,要遵守最左前缀法则


举列来说索引含有字段id、name、school,可以直接用id字段,也可以id、name这样的顺序,但是name;school都无法使用这个索引。所以在创建联合索引的时候一定要注意索引字段顺序,常用的查询字段放在最前面。


必要时可以使用force index来强制查询走某个索引


有的时候MySQL优化器采取它认为合适的索引来检索SQL语句,但是可能它所采用的索引并不是我们想要的。这时就可以采用forceindex来强制优化器使用我们制定的索引。

当我们使用了范围查询的时候,联合索引可能会失效


对于联合索引来说,如果存在范围查询,比如between、>、<等条件时,会造成后面的索引字段失效。


LEFT JOIN A表为驱动表,INNER JOIN MySQL会自动找出那个数据少的表作用驱动表,RIGHT JOIN B表为驱动表。


网络异常,图片无法展示
|

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
2月前
|
SQL 缓存 监控
MySQL缓存机制:查询缓存与缓冲池优化
MySQL缓存机制是提升数据库性能的关键。本文深入解析了MySQL的缓存体系,包括已弃用的查询缓存和核心的InnoDB缓冲池,帮助理解缓存优化原理。通过合理配置,可显著提升数据库性能,甚至达到10倍以上的效果。
|
2月前
|
SQL 存储 关系型数据库
MySQL体系结构详解:一条SQL查询的旅程
本文深入解析MySQL内部架构,从SQL查询的执行流程到性能优化技巧,涵盖连接建立、查询处理、执行阶段及存储引擎工作机制,帮助开发者理解MySQL运行原理并提升数据库性能。
|
4月前
|
SQL 人工智能 关系型数据库
如何实现MySQL百万级数据的查询?
本文探讨了在MySQL中对百万级数据进行排序分页查询的优化策略。面对五百万条数据,传统的浅分页和深分页查询效率较低,尤其深分页因偏移量大导致性能显著下降。通过为排序字段添加索引、使用联合索引、手动回表等方法,有效提升了查询速度。最终建议根据业务需求选择合适方案:浅分页可加单列索引,深分页推荐联合索引或子查询优化,同时结合前端传递最后一条数据ID的方式实现高效翻页。
268 0
|
5月前
|
SQL 缓存 关系型数据库
MySQL 慢查询是怎样优化的
本文深入解析了MySQL查询速度变慢的原因及优化策略,涵盖查询缓存、执行流程、SQL优化、执行计划分析(如EXPLAIN)、查询状态查看等内容,帮助开发者快速定位并解决慢查询问题。
245 0
|
2月前
|
SQL 关系型数据库 MySQL
MySQL的查询操作语法要点
储存过程(Stored Procedures) 和 函数(Functions) : 储存过程和函数允许用户编写 SQL 脚本执行复杂任务.
222 14
|
2月前
|
SQL 关系型数据库 MySQL
MySQL的查询操作语法要点
以上概述了MySQL 中常见且重要 的几种 SQL 查询及其相关概念 这些知识点对任何希望有效利用 MySQL 进行数据库管理工作者都至关重要
103 15
|
2月前
|
SQL 监控 关系型数据库
SQL优化技巧:让MySQL查询快人一步
本文深入解析了MySQL查询优化的核心技巧,涵盖索引设计、查询重写、分页优化、批量操作、数据类型优化及性能监控等方面,帮助开发者显著提升数据库性能,解决慢查询问题,适用于高并发与大数据场景。
|
2月前
|
SQL 关系型数据库 MySQL
MySQL入门指南:从安装到第一个查询
本文为MySQL数据库入门指南,内容涵盖从安装配置到基础操作与SQL语法的详细教程。文章首先介绍在Windows、macOS和Linux系统中安装MySQL的步骤,并指导进行初始配置和安全设置。随后讲解数据库和表的创建与管理,包括表结构设计、字段定义和约束设置。接着系统介绍SQL语句的基本操作,如插入、查询、更新和删除数据。此外,文章还涉及高级查询技巧,包括多表连接、聚合函数和子查询的应用。通过实战案例,帮助读者掌握复杂查询与数据修改。最后附有常见问题解答和实用技巧,如数据导入导出和常用函数使用。适合初学者快速入门MySQL数据库,助力数据库技能提升。
|
3月前
|
存储 关系型数据库 MySQL
使用命令行cmd查询MySQL表结构信息技巧分享。
掌握了这些命令和技巧,您就能快速并有效地从命令行中查询MySQL表的结构信息,进而支持数据库维护、架构审查和优化等工作。
377 9
|
3月前
|
缓存 关系型数据库 MySQL
降低MySQL高CPU使用率的优化策略。
通过上述方法不断地迭代改进,在实际操作中需要根据具体场景做出相对合理判断。每一步改进都需谨慎评估其变动可能导致其他方面问题,在做任何变动前建议先在测试环境验证其效果后再部署到生产环境中去。
203 6