Mysql慢Sql排查

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: Mysql慢Sql排查

本文正在参与 “性能优化实战记录”话题征文活动

company_id和odds_typeid的值并不够散列(company_id表少于1k条就表示不够散列),不必要创建索引。

出现慢sql警告,排查语句是否有问题。

mysql> SELECT * FROM `basketball_ls_match_odds` WHERE `match_id` = 3554260 AND `company_id` = 15 order by id desc limit 1\G
*************************** 1. row ***************************
             id: 27071647
       match_id: 3554260
     company_id: 15
    odds_typeid: 1
rightteam_score: 0.8600
 handicap_score: -20.5000
 leftteam_score: 0.9000
  handicap_time: 1595497414
    create_time: 2020-07-23 17:43:37
    update_time: 1970-12-31 08:00:00
1 row in set (0.50 sec)

sql速度太慢。开始分析。

mysql> explain SELECT * FROM `basketball_ls_match_odds` WHERE `match_id` = 3554260 AND 
  `company_id` = 15 order by id desc limit 1\G
  *************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: basketball_ls_match_odds
   partitions: NULL
         type: index_merge
  possible_keys: idx_match_id,idx_company_id
          key: idx_match_id,idx_company_id
      key_len: 4,4
          ref: NULL
         rows: 910
     filtered: 100.00
        Extra: Using intersect(idx_match_id,idx_company_id); Using where; Using filesort
  1 row in set, 1 warning (0.00 sec)

使用到了聚合索引。

猜想此处索引应该有问题。

使用强制索引

mysql> SELECT * FROM `basketball_ls_match_odds` force index(idx_match_id) WHERE `match_id` = 3554260 AND `company_id` = 15 order by id desc limit 1\G
*************************** 1. row ***************************
             id: 27071647
       match_id: 3554260
     company_id: 15
    odds_typeid: 1
rightteam_score: 0.8600
 handicap_score: -20.5000
 leftteam_score: 0.9000
  handicap_time: 1595497414
    create_time: 2020-07-23 17:43:37
    update_time: 1970-12-31 08:00:00
1 row in set (0.01 sec)

使用索引时,查询速度正常

查看表结构

mysql> desc basketball_ls_match_odds;
+-----------------+------------------+------+-----+---------------------+----------------+
| Field           | Type             | Null | Key | Default             | Extra          |
+-----------------+------------------+------+-----+---------------------+----------------+
| id              | int(11) unsigned | NO   | PRI | NULL                | auto_increment |
| match_id        | int(11) unsigned | NO   | MUL | 0                   |                |
| company_id      | int(11)          | NO   | MUL | 0                   |                |
| odds_typeid     | tinyint(2)       | NO   | MUL | 0                   |                |
| rightteam_score | decimal(8,4)     | NO   |     | 0.0000              |                |
| handicap_score  | decimal(8,4)     | NO   |     | 0.0000              |                |
| leftteam_score  | decimal(8,4)     | NO   |     | 0.0000              |                |
| handicap_time   | int(11)          | NO   |     | 0                   |                |
| create_time     | timestamp        | NO   |     | 1970-12-31 08:00:00 |                |
| update_time     | timestamp        | NO   |     | 1970-12-31 08:00:00 |                |
+-----------------+------------------+------+-----+---------------------+----------------+
10 rows in set (0.00 sec)

得出结论,索引创建的有问题。company_id和odds_typeid的值并不够散列(company_id表少于1k条就表示不够散列),不必要创建索引。

删除索引

mysql> ALTER TABLE `basketball_ls_match_odds` DROP INDEX `idx_odds_typeid`, DROP INDEX `idx_company_id`;
Query OK, 0 rows affected (0.13 sec)
Records: 0  Duplicates: 0  Warnings: 0

再次查询

mysql> SELECT * FROM `basketball_ls_match_odds` WHERE `match_id` = 3554260 AND `company_id` = 15 order by id desc limit 1\G
*************************** 1. row ***************************
             id: 27071647
       match_id: 3554260
     company_id: 15
    odds_typeid: 1
rightteam_score: 0.8600
 handicap_score: -20.5000
 leftteam_score: 0.9000
  handicap_time: 1595497414
    create_time: 2020-07-23 17:43:37
    update_time: 1970-12-31 08:00:00
1 row in set (0.00 sec)

优化成功



相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4天前
|
SQL 运维 关系型数据库
MySQL 运维 SQL 备忘
MySQL 运维 SQL 备忘录
20 1
|
14天前
|
SQL 存储 关系型数据库
SQL文件导入MySQL数据库的详细指南
数据库中的数据转移是一项常规任务,无论是在数据迁移过程中,还是在数据备份、还原场景中,导入导出SQL文件显得尤为重要。特别是在使用MySQL数据库时,如何将SQL文件导入数据库是一项基本技能。本文将详细介绍如何将SQL文件导入MySQL数据库,并提供一个清晰、完整的步骤指南。这篇文章的内容字数大约在
31 1
|
6天前
|
SQL 存储 关系型数据库
mysql 数据库空间统计sql
mysql 数据库空间统计sql
19 0
|
6天前
|
SQL 存储 关系型数据库
mysql SQL必知语法
本文详细介绍了MySQLSQL的基本语法,包括SELECT、FROM、WHERE、GROUPBY、HAVING、ORDERBY等关键字的使用,以及数据库操作如创建、删除表,数据类型,插入、查询、过滤、排序、连接和汇总数据的方法。通过学习这些内容,读者将能更好地管理和操
8 0
|
14天前
|
SQL 分布式计算 关系型数据库
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
54 0
|
9天前
|
存储 SQL 关系型数据库
Mysql学习笔记(二):数据库命令行代码总结
这篇文章是关于MySQL数据库命令行操作的总结,包括登录、退出、查看时间与版本、数据库和数据表的基本操作(如创建、删除、查看)、数据的增删改查等。它还涉及了如何通过SQL语句进行条件查询、模糊查询、范围查询和限制查询,以及如何进行表结构的修改。这些内容对于初学者来说非常实用,是学习MySQL数据库管理的基础。
43 6
|
7天前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
39 3
Mysql(4)—数据库索引
|
9天前
|
SQL Ubuntu 关系型数据库
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
本文为MySQL学习笔记,介绍了数据库的基本概念,包括行、列、主键等,并解释了C/S和B/S架构以及SQL语言的分类。接着,指导如何在Windows和Ubuntu系统上安装MySQL,并提供了启动、停止和重启服务的命令。文章还涵盖了Navicat的使用,包括安装、登录和新建表格等步骤。最后,介绍了MySQL中的数据类型和字段约束,如主键、外键、非空和唯一等。
30 3
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
|
14天前
|
缓存 算法 关系型数据库
Mysql(3)—数据库相关概念及工作原理
数据库是一个以某种有组织的方式存储的数据集合。它通常包括一个或多个不同的主题领域或用途的数据表。
38 5
Mysql(3)—数据库相关概念及工作原理
|
1天前
|
存储 关系型数据库 MySQL
如何在MySQL中创建数据库?
【10月更文挑战第16天】如何在MySQL中创建数据库?