MySQL数据库SQL语句优化


MySQL数据库SQL语句优化

判断问题sql

判断SQL是否有问题时可以通过两个表象进行判断:

  • 系统级别表象
    • CPU消耗严重
    • IO等待严重
    • 页面响应时间过长
    • 应用的日志出现超时等错误

可以使用sar命令,top命令查看当前系统状态。

file

也可以通过Prometheus、Grafana等监控工具观察系统状态。

image

  • SQL语句表象
    • 冗长
    • 执行时间过长
    • 从全表扫描获取数据
    • 执行计划中的rows、cost很大

冗长的SQL都好理解,一段SQL太长阅读性肯定会差,而且出现问题的频率肯定会更高。更进一步判断SQL问题就得从执行计划入手,如下所示:

image

执行计划告诉我们本次查询走了全表扫描Type=ALL,rows很大(9950400)基本可以判断这是一段"有味道"的SQL。

获取问题SQL

不同数据库有不同的获取方法,以下为目前主流数据库的慢查询SQL获取工具

  • MySQL
    • 慢查询日志
    • 测试工具loadrunner
    • Percona公司的ptquery等工具
  • Oracle
    • AWR报告
    • 测试工具loadrunner等
    • 相关内部视图如v$sql、v$session_wait等
    • GRID CONTROL监控工具
  • 达梦数据库
    • AWR报告
    • 测试工具loadrunner等
    • 达梦性能监控工具(dem)
    • 相关内部视图如v$sql、v$session_wait等

SQL编写技巧

SQL编写有以下几个通用的技巧:

• 合理使用索引

索引少了查询慢;索引多了占用空间大,执行增删改语句的时候需要动态维护索引,影响性能选择率高(重复值少)且被where频繁引用需要建立B树索引;一般join列需要建立索引;复杂文档类型查询采用全文索引效率更好;索引的建立要在查询和DML性能之间取得平衡;复合索引创建时要注意基于非前导列查询的情况

• 使用UNION ALL替代UNION

UNION ALL的执行效率比UNION高,UNION执行时需要排重;UNION需要对数据进行排序

• 避免select * 写法

执行SQL时优化器需要将 * 转成具体的列;每次查询都要回表,不能走覆盖索引。

• JOIN字段建议建立索引

一般JOIN字段都提前加上索引

• 避免复杂SQL语句

提升可阅读性;避免慢查询的概率;可以转换成多个短查询,用业务端处理

• 避免where 1=1写法

• 避免order by rand()类似写法

RAND()导致数据列被多次扫描

SQL优化    执行计划

完成SQL优化一定要先读执行计划,执行计划会告诉你哪些地方效率低,哪里可以需要优化。我们以MYSQL为例,看看执行计划是什么。(每个数据库的执行计划都不一样,需要自行了解)

image

字段 解释
id 每个被独立执行的操作标识,标识对象被操作的顺序,id值越大,先被执行,如果相同,执行顺序从上到下
select_type 查询中每个select 字句的类型
table 被操作的对象名称,通常是表名,但有其他格式
partitions 匹配的分区信息(对于非分区表值为NULL)
type 连接操作的类型
possible_keys 可能用到的索引
key 优化器实际使用的索引(最重要的列) 从最好到最差的连接类型为consteq_regrefrangeindexALL。当出现ALL时表示当前SQL出现了“坏味道”
key_len 被优化器选定的索引键长度,单位是字节
ref 表示本行被操作对象的参照对象,无参照对象为NULL
rows 查询执行所扫描的元组个数(对于innodb,此值为估计值)
filtered 条件表上数据被过滤的元组个数百分比
extra 执行计划的重要补充信息,当此列出现Using filesort , Using temporary 字样时就要小心了,很可能SQL语句需要优化

接下来我们用一段实际优化案例来说明SQL优化的过程及优化技巧。

优化案例

  • 表结构

    启科网络PHP商城系统 启科网络PHP商城系统

    启科网络商城系统由启科网络技术开发团队完全自主开发,使用国内最流行高效的PHP程序语言,并用小巧的MySql作为数据库服务器,并且使用Smarty引擎来分离网站程序与前端设计代码,让建立的网站可以自由制作个性化的页面。 系统使用标签作为数据调用格式,网站前台开发人员只要简单学习系统标签功能和使用方法,将标签设置在制作的HTML模板中进行对网站数据、内容、信息等的调用,即可建设出美观、个性的网站。

    启科网络PHP商城系统 0 查看详情 启科网络PHP商城系统
  • CREATE TABLE `a` ( `id` int(11) NOT NULLAUTO_INCREMENT, `seller_id` bigint(20) DEFAULT NULL, `seller_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, `gmt_create` varchar(30) DEFAULT NULL, PRIMARY KEY (`id`) ); CREATE TABLE `b` ( `id` int(11) NOT NULLAUTO_INCREMENT, `seller_name` varchar(100) DEFAULT NULL, `user_id` varchar(50) DEFAULT NULL, `user_name` varchar(100) DEFAULT NULL, `sales` bigint(20) DEFAULT NULL, `gmt_create` varchar(30) DEFAULT NULL, PRIMARY KEY (`id`) ); CREATE TABLE `c` ( `id` int(11) NOT NULLAUTO_INCREMENT, `user_id` varchar(50) DEFAULT NULL, `order_id` varchar(100) DEFAULT NULL, `state` bigint(20) DEFAULT NULL, `gmt_create` varchar(30) DEFAULT NULL, PRIMARY KEY (`id`) );
  • 三张表关联,查询当前用户在当前时间前后10个小时的订单情况,并根据订单创建时间升序排列,具体SQL如下

  • select a.seller_id,          a.seller_name,          b.user_name,          c.state   from a,        b,        c   where a.seller_name = b.seller_name     and b.user_id = c.user_id     and c.user_id = 17     and a.gmt_create       BETWEEN DATE_ADD(NOW(), INTERVAL – 600 MINUTE)       AND DATE_ADD(NOW(), INTERVAL 600 MINUTE)   order by a.gmt_create
  • 查看数据量

    image

  • 原执行时间

    image

  • 原执行计划

    image

  • 初步优化思路

  • SQL中 where条件字段类型要跟表结构一致,表中user_id 为varchar(50)类型,实际SQL用的int类型,存在隐式转换,也未添加索引。将b和c表user_id 字段改成int类型。

  • 因存在b表和c表关联,将b和c表user_id创建索引

  • 因存在a表和b表关联,将a和b表seller_name字段创建索引

  • 利用复合索引消除临时表和排序

  • 初步优化SQL

  • alter table b modify `user_id` int(10) DEFAULT NULL;   alter table c modify `user_id` int(10) DEFAULT NULL;   alter table c add index `idx_user_id`(`user_id`);   alter table b add index `idx_user_id_sell_name`(`user_id`,`seller_name`);   alter table a add index `idx_sellname_gmt_sellid`(`gmt_create`,`seller_name`,`seller_id`);
  • 查看优化后执行时间

    image

  • 查看优化后执行计划

    image

  • 查看warnings信息

    image

  • 继续优化

  • alter table a modify "gmt_create" datetime DEFAULT NULL
  • 查看执行时间

image

  • 查看执行计划

image

优化总结

  1. 查看执行计划 explain
  2. 如果有告警信息,查看告警信息 show warnings;
  3. 查看SQL涉及的表结构和索引信息
  4. 根据执行计划,思考可能的优化点
  5. 按照可能的优化点执行表结构变更、增加索引、SQL改写等操作
  6. 查看优化后的执行时间和执行计划

如果优化效果不明显,重复第四步操作

推荐 《mysql视频教程》  

以上就是MySQL数据库SQL语句优化的详细内容,更多请关注其它相关文章!


# 语句优化  # 执行时间  # 镜像  # 解锁  # 可以通过  # 测试工具  # 分区表  # 被操  # mysql  # 南宁网站优化电池  # 郑州网站推广方式有几种  # 周口网站建设优化推广  # 朝阳营销推广厂家有哪些  # 贵港网络营销推广  # 吉安网络营销推广  # 新密全网营销推广系统  # 益阳怎么做网站优化  # 网站百度推广附加创意  # 网站建设推广 溦訫hfqjwl上线付费  # 这是  # 修改密码  # 值为 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: J*aScript包管理器_Npm与Yarn对比  构建可配置的J*aScript加权点击计数器与共享总计功能  店铺如何做视频号推广?做视频号推广有用吗?  泰拉瑞亚水晶无法放置问题  广州地铁app准妈咪徽章领取方法  大众点评了却看不到是怎么回事  《全民k歌》网页版最新登录入口一览  AO3永久镜像入口开放_AO3最新网址兼容所有浏览器  如何用Golang优化微服务间请求性能_Golang 微服务请求性能优化方法  在J*a中如何实现类的继承与方法重用_OOP继承方法重用技巧分享  抖音评论无法发送如何修复 抖音评论功能操作指南  4399小游戏下装链接 4399小游戏下载链接入口  抖音小程序怎么开通?小程序开通条件是什么?  三角洲行动2025年9月10日摩斯密码分享  多闪APP官方下载安装入口_多闪最新版本获取入口  偃武诸葛亮阵容搭配推荐  如何高效地基于键列值映射DataFrame中的多个列  传统曲艺莲花落的表演形式是  Keras中Convolution2D层及其核心辅助层详解  iPhone 14 Pro如何更改区域设置_iPhone 14 Pro地区语言修改教程  2025SNH48年度青春盛典门票价格及购买方式  MacBook Pro词典使用指南  《虎扑》关闭社区内容推荐方法  火狐浏览器无法自动更新怎么办 手动更新火狐浏览器到最新版本【解决】  芒果TV官网登录入口 芒果TV官方网站登录入口  三星A55应用闪退排查步骤_Samsung A55稳定性优化技巧  《随手记》关闭首页消息推送方法  Excel如何快速找到并断开外部数据源链接_Excel外部数据源断开方法  包子漫画在线观看入口 包子漫画网正版全集链接  win11关机几秒又自己开机 Win11关机自动重启问题修复  mysql中如何分析索引使用情况_mysql索引使用分析方法  qq邮箱格式填写示例 qq邮箱标准填写规范  Win10如何查看已安装的更新补丁 Win10卸载指定更新教程【教程】  Highcharts雷达图径向轴数值标签实现教程  胃动力不足?试试这5个调理方法  作业帮网页版不用下载入口 在线问老师快速答疑  b站如何管理订阅_b站订阅标签分类管理  谷歌浏览器如何查找和删除恶意软件 谷歌浏览器内置安全清理工具使用教程  Python定时发送QQ消息  Word 2003字体大小设置方法  XPath动态元素定位:如何精准选择文本内容变化的元素  使用Selenium在无头Chrome中交互动态菜单和复选框的策略  b站怎么查看视频的码率_b站视频码率查看方法  《小宇宙》标记不友善评论方法  《猎聘》筛选猎头岗位方法  Mac如何开启画中画模式_Mac Safari浏览器视频画中画功能  126手机126邮箱登录_126邮箱手机登录入口官网  Win10输入法不见了怎么办 Win10找回语言栏图标教程  《画加》约稿流程  智慧团建活动报名入口 智慧团建活动报名入口手机端官网​ 

 2019-11-27

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.