1

mysql 查询时的优化

 2 years ago
source link: https://www.v2ex.com/t/924774
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

V2EX  ›  程序员

mysql 查询时的优化

  dust0522 · 5 小时 50 分钟前 · 787 次点击

为什么有时候用了 join 比没用 join 的还快,MySQL 做了什么优化

register InnoDB 16w 数据 mer_no 有索引 mcc_cd 没索引 mccs MyISAM 300 条数据 code 没索引

-- 0.25 秒以上 SELECT * FROM register WHERE mer_no = '10373914029XXXXXXXXX' limit 1

-- 0.18 秒 SELECT * FROM register mr LEFT JOIN mccs mc ON mc.code = mr.mcc_cd WHERE mr.mer_no = '10373914029XXXXXXXXX' limit 1

15 条回复    2023-03-17 12:51:21 +08:00
dust0522

dust0522      5 小时 46 分钟前

register InnoDB 16w 数据 mer_no 有索引


mcc_cd 没索引 mccs MyISAM 300 条数据 code 没索引

-- 0.25 秒以上 SELECT * FROM register WHERE mer_no = '10373914029XXXXXXXXX' limit 1

-- 0.18 秒 SELECT * FROM register mr LEFT JOIN mccs mc ON mc.code = mr.mcc_cd WHERE mr.mer_no = '10373914029XXXXXXXXX' limit 1
dust0522

dust0522      5 小时 44 分钟前

表:register InnoDB 16w 条数据 mer_no 有索引 、mcc_cd 没索引

表:mccs MyISAM 300 条数据 code 没索引

-- 0.25 秒以上

SELECT * FROM register WHERE mer_no = '10373914029XXXXXXXXX' limit 1

-- 0.18 秒

SELECT * FROM register mr LEFT JOIN mccs mc ON mc.code = mr.mcc_cd WHERE mr.mer_no = '10373914029XXXXXXXXX' limit 1
weijancc

weijancc      5 小时 41 分钟前

mer_no 有索引那应该是第一条查询更快才对, 会不会是网络问题呢
Braisdom

Braisdom      5 小时 40 分钟前

这难道不是 MySQL 的 Bug 吗?
opengps

opengps      5 小时 37 分钟前

0.18 与 0.25 似乎没啥可比性,有没有更显著的数字展示下?查询提速能考虑的无非就是索引合理性
opengps

opengps      5 小时 35 分钟前

重启下 mysql 服务,只记录首次查询语句耗时(释放掉索引的缓存,排除下这个因素)
xsonglive491

xsonglive491      5 小时 35 分钟前

你直接 explain format='json' 一下看看怎么回事就好了,可以看到查询的顺序
rekulas

rekulas      5 小时 32 分钟前

索引列 limit 1 百毫秒级,索引已经出问题了,别纠结快慢问题了,删除索引重建吧。。。
BiChengfei

BiChengfei      5 小时 30 分钟前

用的 navicat 吗,单位秒太大了,不容易分析,看看有没有毫秒的时间显示,我觉得有可能是缓存导致的,使用 select sql_no_cache xxx 试试,还是不行的话,用 shell 客户端试试
个人分析,经过 MySQL 查询优化器的处理,第一种直接回表 register 查询出来,第二种需要先 register 回表,再去 join mccs 表,路径长了一步,所以第一种绝对快。第二种应该是用了第一种的缓存,再加上 json mccs 表,因为 mccs 表数据很少,所以比第一种快了一点
dust0522

dust0522      4 小时 59 分钟前

我用 show profiles; 查出来的两个查询的时间差距,第二个查询没用 limit 都比第一个快,只是觉得很奇怪。

10 0.00037925 SELECT mr.* from register mr WHERE mer_no = '10373914029XXXXXXXXX' limit 1

17 0.0005085 SELECT mr2.* FROM register mr2 LEFT JOIN mccs mc ON mc.`code` = mr2.mcc_cd WHERE mr2.mer_no = '10373914029XXXXXXXXX'

@BiChengfei @rekulas @opengps @weijancc
dust0522

dust0522      4 小时 57 分钟前

{
"query_block": {
"select_id": 1,
"cost_info": {
"query_cost": "1.20"
},
"table": {
"table_name": "mr",
"access_type": "ref",
"possible_keys": [
"mer_no"
],
"key": "mer_no",
"used_key_parts": [
"mer_no"
],
"key_length": "83",
"ref": [
"const"
],
"rows_examined_per_scan": 1,
"rows_produced_per_join": 1,
"filtered": "100.00",
"cost_info": {
"read_cost": "1.00",
"eval_cost": "0.20",
"prefix_cost": "1.20",
"data_read_per_join": "10K"
},
"used_columns": [
*
]
}
}
}
dust0522

dust0522      4 小时 56 分钟前

{
"query_block": {
"select_id": 1,
"cost_info": {
"query_cost": "52.94"
},
"nested_loop": [
{
"table": {
"table_name": "mr2",
"access_type": "ref",
"possible_keys": [
"mer_no"
],
"key": "mer_no",
"used_key_parts": [
"mer_no"
],
"key_length": "83",
"ref": [
"const"
],
"rows_examined_per_scan": 1,
"rows_produced_per_join": 1,
"filtered": "100.00",
"cost_info": {
"read_cost": "1.00",
"eval_cost": "0.20",
"prefix_cost": "1.20",
"data_read_per_join": "10K"
},
"used_columns": [
*
]
}
},
{
"table": {
"table_name": "mc",
"access_type": "ALL",
"rows_examined_per_scan": 231,
"rows_produced_per_join": 231,
"filtered": "100.00",
"using_join_buffer": "Block Nested Loop",
"cost_info": {
"read_cost": "5.54",
"eval_cost": "46.20",
"prefix_cost": "52.94",
"data_read_per_join": "274K"
},
"used_columns": [
"code"
],
"attached_condition": "<if>(is_not_null_compl(mc), (`trans-core`.`mc`.`code` = `trans-core`.`mr2`.`mcc_cd`), true)"
}
}
]
}
}
dust0522

dust0522      4 小时 49 分钟前

~~~~~~~~~~用了 sql_no_cache 速度反过来了,什么鬼,应该是缓存的原因了
liuxu

liuxu      3 小时 35 分钟前

@dust0522 #11 #12 从 mysql 角度来说,第一个 sql 成本 1.2 ,第二个 sql 成本 52.94 ,第一个肯定比第一个快,如果用了 sql_no_cache 更快那就对了,可能就是 query cache 的问题,mysql5.7 将它标记为弃用,mysql8 已经把 query cache 去掉了,没什么用,https://dev.mysql.com/doc/refman/5.7/en/query-cache-in-select.html

Recommend

  • 42
    • 掘金 juejin.im 6 years ago
    • Cache

    Mysql 慢查询优化实践

    Mysql 慢查询优化实践 目标: 提高mysql运行效率,增加并发,提高响应速度 方案: 通过阿里云给的慢查询日志excel,对耗时长,开销大的sql语句进行优化,提升访问速度服务器运行效率 实践: 分析 阿里云给的数据库单日报表有以下字段 Create

  • 51
    • zhangcolin.github.io 6 years ago
    • Cache

    MySQL慢查询优化 - 文野

  • 46
    • 掘金 juejin.im 6 years ago
    • Cache

    MySQL索引与查询优化

    目录 About MySQL Why MySQL MySQL Index Why Index 索引是如何工作的 如何使用 创建索引 查看索引 删除索引 索引的使用原则 写操作比较频繁的列慎重加索引 索引越多占用磁盘空间越大 不要为输出列加索引

  • 34
    • www.cnblogs.com 5 years ago
    • Cache

    Mysql优化大分页查询

    如题,年前做了一个需求,涉及到Mysql大分页查询,整理一下,希望对需要的小伙伴有帮助。 背景 系统结构如上图。经过...

  • 11
    • segmentfault.com 4 years ago
    • Cache

    【MySQL—优化】查询性能优化

    前面介绍了如何设计最优的库表结构、如何建立最好的索引,这些对于高性能来说是必不可少的。但这些还不够——还需要合理的设计查询。如果查询写得很糟糕,即使库表结构再合理、索引再合适,也无法实现高性能。 剖析单条查询的性能...

  • 9

    一文读懂MySQL的索引结构及查询优化 - 程序员八阿哥的个人空间 - OSCHINA - 中文开源技术交流社区 同时再次强调,这几篇关于MySQL的探究都是基于5.7版本,相关总结与结论不一定适用于其他版本) MySQL官方文档中(

  • 9
    • segmentfault.com 3 years ago
    • Cache

    MySQL: 使用explain 优化查询性能

    Explain 介绍为了优化MySQL的SQL语句的执行性能,MySQL提供了explain关键字用于查看SQL的执行计划。格式如下:{EXPLAIN | DESCRIBE | DESC} tbl_name [col_name | wild] {EXPLAIN | DESCRIBE | DESC} [explain_type] {exp...

  • 6
    • crazyrico.github.io 3 years ago
    • Cache

    Mysql优化之慢查询

    什么是慢查询慢查询日志,顾名思义,就是查询慢的日志,是指mysql记录所有执行超过 long_query_time参数设定的时间阈值的SQL语句的日志。该日志能为SQL...

  • 4
    • dreamgoing.github.io 2 years ago
    • Cache

    MySQL查询Plan优化

    MySQL 查询Plan优化Query Planning and Optimization 课程学习笔记MySQL 查询过程全局来看,MySQL主要由两个关键部分组成,server服务端和storage engine两部分组成。查询优化(Query optimization)

  • 7
    • greeensy.github.io 2 years ago
    • Cache

    Mysql查询优化 | GreeenSY's Blog

    MySQL查询优化器有几个目标,但是其中最主要的目标是尽可能地使用索引,并且使用最严格的索引来 消除尽可能多的数据行。你的最终目标是提交SELECT语句查找 数据行,而不是排除数据行。优化器试图排除数据行的原因在 于它排除数据行的速度越快,那么...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK