最新要闻
- 中国三大红茶产地是哪里?有什么特点?
- 知名PS3模拟器RPCS3放弃Win7!将仅支持Win10/11系统
- 国产ACT大作!《失落之魂》新光追演示惊艳
- 我要我们在一起 邓紫棋mp3 百度网盘_我要我们在一起 邓紫棋
- 蔚来:好人就该被人拿枪指着?
- 4L油箱多跑80km、售价2000元 宝骏悦也增程器实体亮相
- 可怕!男子肠道长满200多个息肉:做了3个小时手术摘除
- 高质量发展调研行丨山东烟台:“老树新枝”打造发展新动能
- 泽璟制药:注射用ZG006获得药物临床试验批准通知书
- 韩国室温超导论文真假成谜 专家:极有可能只是假象
- vivo首颗自研6nm芯片!V3影像芯片正式公布
- 这东西也敢偷?卖不掉,就扔进垃圾场……栽了!
- 《封神》票房跻身第四!国内7月总票房突破80亿元
- 华为暴涨58%!2023Q2中国手机市场销量数据出炉
- 被中消协点名后 妙鸭相机上架苹果应用商店:山寨App横行真假难分
- 骁龙870太坚挺!联想小新Pad Pro 12.7上架:2.9K高刷屏
手机

英国房地产因利率上升陷入困境 房价正以2011年来最快速度下跌

宁夏评选出上半年10名“宁夏好人” 95后消防员因敬业奉献入选
- 英国房地产因利率上升陷入困境 房价正以2011年来最快速度下跌
- 宁夏评选出上半年10名“宁夏好人” 95后消防员因敬业奉献入选
- 离婚时共同债务应该怎么处理?
- 华为云盘古大模型3.0正式发布
- 支持自动长文生成,WPS AI发布:基于大语言模型的智能办公助手
- 《街头霸王6》全球总销量突破200万份 卡普空再次为其玩家送上礼物
家电
mysql 简单进阶 ———— 重构查询[二]
前言
简单整理一下重构查询。
正文
为什么我们需要重构查询,原因也很简单,那就是查询慢。
(相关资料图)
为什么会查询慢?
查询性能慢底下的最基本的原因是访问的数据太多。 某些查询不可避免地需要筛选大量的数据,但这并不常见。
大部分性能低下的查询都可以通过减少访问的数据流的方式进行优化。
- 确认应用程序是否检索大量超过需要的数据。这意味着访问了太多的行,但有时候也可能访问了太多的列。
- 确认mysql 服务器是否在分析大量超过需要的数据行。
最先想到的是是否向数据库请求了不需要的数据。
举个很低级的例子:
- 查询了多余的行
在c#的linq中通过tolist在执行了 "select * from payment",然后通过take 和 skip 来获取需要的数据,这个时候其实是查询了全部的行,然后才在应用层进行过滤了。
- 查询了多余的列
比如select * from payment中,通过查询了全部的列,但是很多列是不需要的。
但是这个也不能以偏概全,要看应用场景,比如查询出来做缓存,那么可能只查询了一次,然后用的是缓存的数据,但是通过查询多余的列出来可以供多个地方使用。
- 重复查询了通用的数据
比如一个数据高频访问,低更新,那么就应该考虑使用缓存了,这样避免大量的查询。
还有一个重要的指标,mysql 是否扫描了额外的记录。
是否扫描了额外的记录,有下面3个标准:
响应的时间
扫描的行数
返回的行数
没有哪个指标能够完美地衡量查询的开销,但是他们能够反映了mysql在内部执行查询时候需要访问的数据,并可以大概推算出运行的时间。
这三个指标都会记录到mysql的慢日志中,所以检查慢日志记录是找出扫描行数过多的查询的好办法。
- 响应时间
响应时间包括两个,一个是服务时间,一个是排队时间。
服务时间是指数据库处理这个查询真正花了多长时间。排队时间是指因为等待某些资源而没有真正的执行查询的时间,可能是等i/o 操作完成,也可能是等行锁。
- 扫描的行数和返回的行数
最理想的情况是扫描的行数等于返回的行数,这个就太理想了。一般是在1:1,和10:1之间,那么就是要尽量减少扫描的行数。
- 扫描的行数和访问的类型
这个访问的类型指的是explain 后,返回的类型。
1. id:表示查询执行计划中的每个步骤的唯一标识符。id的值越大,表示该步骤的执行顺序越靠后。2. select_type:表示该步骤的查询类型。常见的查询类型包括SIMPLE(简单查询)、PRIMARY(主查询)、SUBQUERY(子查询)等。3. table:表示该步骤涉及的表名。4. partitions:表示该步骤涉及的分区。5. type:表示该步骤使用的访问方法,也称为连接类型。常见的访问方法包括ALL(全表扫描)、index(使用索引扫描)、range(范围扫描)等。6. possible_keys:表示该步骤可能使用的索引。7. key:表示该步骤实际使用的索引。8. key_len:表示该步骤使用的索引的长度。9. ref:表示该步骤使用的索引的列与前一个步骤的关联条件。10. rows:表示该步骤扫描的行数。11. filtered:表示该步骤满足WHERE条件的行数占总扫描行数的比例。12. Extra:表示该步骤的额外信息。常见的额外信息包括Using filesort(使用文件排序)、Using temporary(使用临时表)等。
上面说一下可能难以理解的几个元素:
key_len字段表示使用的索引的长度,它表示索引中被使用的字节数。索引长度越短,查询性能通常越好。举个例子来说明key_len的含义:假设有一个表table,其中有一个列name定义为VARCHAR(100),并且有一个非唯一索引idx_name(name)。如果在查询中使用了以下条件:SELECT * FROM table WHERE name = "John"那么在执行EXPLAIN语句后,可以看到key_len字段的值为100。这是因为查询条件中的name列的长度为100,索引idx_name的长度也为100,所以key_len的值为100。另外,如果查询条件中使用了name列的前缀,比如:SELECT * FROM table WHERE name LIKE "J%"那么在执行EXPLAIN语句后,可以看到key_len字段的值会根据前缀的长度而变化。如果前缀长度为1,则key_len的值为1。如果前缀长度为2,则key_len的值为2。以此类推。需要注意的是,key_len并不是表示索引的实际长度(比如字节数),而是表示索引中被使用的字节数。它可以用于比较不同查询条件对索引的利用程度,从而进行索引的优化。
这里很多人理解的可能就以为是索引的长度,其实是实际使用的索引的长度。
还有一个是ref:
在MySQL的EXPLAIN输出中,ref是一个关键字段,表示查询过程中使用的索引列与上一个表的列之间的引用关系。ref字段通常用于连接操作(JOIN)中,指示连接条件使用的索引列。以下是一个具体的例子来解释ref字段的含义:假设有两个表table1和table2,它们的结构如下:table1:- id (主键)- nametable2:- id (主键)- table1_id (外键)现在我们执行以下查询语句:SELECT * FROM table1 JOIN table2 ON table1.id = table2.table1_id WHERE table1.name = "John"在执行EXPLAIN语句后,可以看到以下输出:id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | Extra1 | SIMPLE | table1| NULL | ref | PRIMARY | PRIMARY | 4 | const | 1 | Using index1 | SIMPLE | table2| NULL | ref | table1_id | table1_id | 4 | table1.id | 2 | Using index- ref字段:在这个例子中,第二行的ref字段的值为table1.id,表示查询过程中使用了table1表的id列作为索引列与table2表的table1_id列进行连接。- key字段:key字段的值为table1_id,表示查询使用了名为table1_id的索引。- rows字段:rows字段的值为2,表示MySQL估计需要扫描的行数为2。在这个例子中,我们可以看到ref字段指示了连接操作中使用的索引列之间的引用关系。通过理解ref字段的含义,我们可以更好地理解连接操作的执行过程,并进行性能优化和调整。在MySQL的EXPLAIN输出中,当ref字段的值为const时,表示查询过程中使用的索引列与一个常量值之间的引用关系。这意味着查询使用了一个常量值来匹配索引列。以下是一个具体的例子来解释ref字段为const的含义:假设有一个表table,其中有两个列id和name,并且有一个唯一索引idx_name(name)。现在我们执行以下查询语句:SELECT * FROM table WHERE name = "John"在执行EXPLAIN语句后,可以看到以下输出:id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | Extra1 | SIMPLE | table | NULL | ref | idx_name | idx_name | 102 | const | 1 | Using index- ref字段:在这个例子中,ref字段的值为const,表示查询过程中使用的索引列与常量值之间的引用关系。- key字段:key字段的值为idx_name,表示查询使用了名为idx_name的索引。- rows字段:rows字段的值为1,表示MySQL估计需要扫描的行数为1。在这个例子中,ref字段为const表示查询使用了常量值来匹配索引列。这样的查询通常会非常高效,因为MySQL可以直接使用索引来定位匹配的行,而不需要进一步的比较操作。总结来说,当ref字段为const时,表示查询使用了一个常量值来匹配索引列,这通常会带来高效的查询性能。除了const之外,ref字段可能还有其他的取值,具体取决于查询语句和索引的使用情况。以下是一些常见的ref取值:1. ref: 当查询使用索引列与另一个表的列进行连接时,ref字段的值可能是另一个表的列名。例如,在连接操作(JOIN)中,如果使用了索引列与另一个表的列进行连接,ref字段可能显示连接条件中使用的列名。2. NULL: 当查询不使用索引列与其他表进行连接时,或者查询没有使用索引时,ref字段的值可能为NULL。这表示查询没有引用其他表的列。3. Multiple values: 在某些情况下,ref字段可能会显示多个值,表示查询使用了多个索引列与其他表的多个列进行连接。这通常发生在复杂的连接操作中。请注意,ref字段的具体取值取决于查询语句、索引的使用和表之间的关系。因此,在不同的查询中,ref字段可能会有不同的取值。了解和理解ref字段的含义可以帮助我们更好地理解查询执行过程,并进行性能优化和调整。当查询不使用任何索引或者没有引用其他表的列时,ref字段的值可能为NULL。这种情况下,查询只涉及到单个表,没有进行连接操作或者索引的使用。以下是一个示例来说明ref字段为NULL的情况:假设有一个表table,其中有两个列id和name。我们执行以下查询语句:SELECT * FROM table WHERE id = 1在执行EXPLAIN语句后,可以看到以下输出:id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | Extra1 | SIMPLE | table | NULL | ALL | NULL | NULL | NULL | NULL| 1 | NULL- ref字段:在这个例子中,ref字段的值为NULL,表示查询没有引用其他表的列,也没有使用任何索引。这种情况下,ref字段为NULL表示查询只涉及到了单个表,没有进行连接操作或者使用索引。这样的查询可能会导致全表扫描,对于大表来说性能较差。在优化查询性能时,可以考虑添加适当的索引或者修改查询语句来避免全表扫描。
那么这个type 有全表扫描、范围扫描、唯一索引查询、常数引用等。
举个例子:
EXPLAIN select film_id, actor_idfrom sakila.film_actorwhere film_id =1;
这里的type 就是通过ref来实现了,也就是通过索引来实现。
如果没有索引会变成下面这样:
就是进行了全表扫描了。扫描了5073行,但是得到了才10行。
type 有下面这些类型:
1. system:表示只有一行的表,这是const类型的一个特例。例如,SELECT * FROM table WHERE primary_key = 1。2. const:表示通过索引一次就能找到的常量值查询。例如,SELECT * FROM table WHERE primary_key = 1。3. eq_ref:表示使用唯一索引查找。例如,SELECT * FROM table1 JOIN table2 ON table1.key = table2.key。4. ref:表示使用非唯一索引查找。例如,SELECT * FROM table1 WHERE key = "value"。5. range:表示使用索引范围查找。例如,SELECT * FROM table WHERE key BETWEEN 1 AND 10。6. index:表示全索引扫描。例如,SELECT * FROM table WHERE key LIKE "value%"。7. all:表示全表扫描。例如,SELECT * FROM table。8. index_merge:表示使用多个索引合并的结果。例如,SELECT * FROM table WHERE key1 = "value" OR key2 = "value"。9. unique_subquery:表示使用子查询的结果进行唯一性判断。例如,SELECT * FROM table WHERE key = (SELECT key FROM other_table)。10. index_subquery:表示使用子查询的结果进行索引查找。例如,SELECT * FROM table WHERE key IN (SELECT key FROM other_table)。
那么如果我们遇到了一个复杂的查询我们应该如何处理呢?
可以将一个复杂的查询分成几个简单的查询,这样扫描的行数,查询的复杂度可能会降低,那么效率就有可能更高。
切分查询
举一个工作中遇到的删除的例子。比如要删除3个月前并且标记为deleted的数据,那么通过语句直接删除是不可能的。
那么可以通过一天一天的查找删除,并且每次删除固定的条数比如50条,这样每次扫描的索引会很少。 其实就是将大的操作,花费的时间分配到更小粒度里面去了。
- 分解关联查询
结
该系列持续更新。
关键词:
-
-
-
-
mysql 简单进阶 ———— 重构查询[二]
中国三大红茶产地是哪里?有什么特点?
知名PS3模拟器RPCS3放弃Win7!将仅支持Win10/11系统
国产ACT大作!《失落之魂》新光追演示惊艳
从0开发属于自己的nestjs框架的mini 版 —— 终极篇
我要我们在一起 邓紫棋mp3 百度网盘_我要我们在一起 邓紫棋
【财经分析】大豆完全成本保险提振豆农积极性和种植信心
蔚来:好人就该被人拿枪指着?
4L油箱多跑80km、售价2000元 宝骏悦也增程器实体亮相
可怕!男子肠道长满200多个息肉:做了3个小时手术摘除
从0开发属于自己的nestjs框架的mini 版 —— Module篇
高质量发展调研行丨山东烟台:“老树新枝”打造发展新动能
Golang漏洞管理
泽璟制药:注射用ZG006获得药物临床试验批准通知书
韩国室温超导论文真假成谜 专家:极有可能只是假象
vivo首颗自研6nm芯片!V3影像芯片正式公布
这东西也敢偷?卖不掉,就扔进垃圾场……栽了!
深圳市住房和建设局:更好满足居民刚性和改善性住房需求 促进房地产市场平稳健康发展
《封神》票房跻身第四!国内7月总票房突破80亿元
华为暴涨58%!2023Q2中国手机市场销量数据出炉
被中消协点名后 妙鸭相机上架苹果应用商店:山寨App横行真假难分
骁龙870太坚挺!联想小新Pad Pro 12.7上架:2.9K高刷屏
曼联新赛季阵容基本完成升级,你认为这个阵容应该拿到什么成绩?
豆瓣7.7分 《封神第一部》票房破10亿:张颂文大赞世界级视听效果
一口下去嘎嘣脆!亲亲经典虾条大促:5件立减15元 17.9到手
“原来微信可以防拉黑”引热议 网友:就喜欢看不惯 又拉黑不了的样子
mysql 简单进阶 ———— 多列索引[一]
事关食品安全,江西明年元旦实施
杜苏芮减弱 卡努正在增强:台风吹来的遍地生蚝 到底能不能吃?
不愧是新能源行业的“基建狂魔” 蔚来1600座换电站达成
20万圆“宝马3系”梦!宝马i3被曝19.6万元特价卖
李玟遗产纷争升级,Bruce发声明低调回应,李思林不予回复
罗布泊无人区究竟有多危险?中国四大无人区之一、充满神秘的“地球之耳”
电竞首次入亚!杭州亚运会电竞项目赛程出炉:玩游戏也能拿金牌了
代码随想录算法训练营第三天|力扣203.移除链表元素、力扣707.设计链表、力扣206.反转链表
【设计原则】图解何为依赖倒置
今年暑期档总票房突破120亿
儿子考上北大 奶茶店主送2000杯奶茶 学生:沾沾喜气
少女连续数日高烧不退确诊“接吻病” 医生科普:病毒感染引起
JFrame一些基础小知识
占用应急车道 深圳一宝马男连着两天被后车拍照举报:12分罚款6000
2176万人观看 《封神第一部》票房逼近10亿 知名编剧:第二部比第一部好看至少十倍
大众被曝将使用小鹏旧平台 明年开始向小鹏支付“技术费”
姚振华,又输了!
J.D.Power发布汽车保值率排行榜:日系车屠榜 飞度保值堪比保时捷
自主知识产权!“新舟”60灭火机平台首飞成功:运输、灭火全能王
北京瑞蚨祥(关于北京瑞蚨祥的介绍)
国人自己的操作系统!华为鸿蒙OS 4.0下周发布:官方海报大有玄机
史上最贵!iPhone 15系列全系售价曝光 网友:多花钱也得买高配版
华为nova 10 Pro官方翻新机视频开箱:成色接近新机 只要2499元起
全国文化和旅游资源开发工作会议在并召开
docker查看日志:docker service logs 与 docker container logs
硬件管理平台 - 引言(一)
男子开车时跟老婆吵架车瞬间报废 承担事故全部责任:网友感叹
票房近10亿!《封神》进2023年票房榜前十:投资30亿 导演称若失败10年还债
12999元 感谢老黄?英伟达喊你买卡了:公版RTX 4090卷土重来
北大青鸟手提式环保家用小型车载灭火器到手9元:安全可靠
属于数据的属性的是及时性、链接性_以下哪种情况属于属性错放
瘫痪男子大脑植入芯片:触觉恢复
警惕“杜苏芮”台风:这些用电常识不可忽视
TCL中环公示单晶硅片价格 上调3.5%-5.2%不等
Go语言中init函数执行的顺序
专家:肥胖人群的肥胖程度越来越高
韩国室温超导是突破还是乌龙?专家解读
win11下docker安装常用中间件-Redis
太平天国进入南京以后,确实犯了很多错误,但是也没必要妖魔化太平天国吧?
电影《热烈》首映日当晚票房破2亿!导演大鹏说把片酬给邓超了
太炫了!索泰ChinaJoy 2023展出多款限量显卡
跨越万里的双向奔赴!父母不懂英语 从县城出国看女儿
车辙是什么意思(车辙解释)
[算法笔记] DFS搜索
从此告别涂硅脂 利民推出新款CPU固态导热硅脂片:一片26.9元
POL连续四年第一!华为已发布新一代Wi-Fi 7万兆园区光网
牧原股份董秘回复:公司目前10万头全线场的人员标准配置为100人左右
民间《中国历代文豪图鉴》出炉:文笔李白唯一100分 白居易6边型战士
台风天在玻璃上贴胶带有用吗?300万粉大V科普:徒劳无益 画蛇添足
2023第二季度快递满意度出炉:第一不出意料
马斯克能忍?国内惊显特斯拉Semi电动卡车仿制品 网友:贴脸输出
虐心(关于虐心简述)
蜜雪冰城阴阳怪气瑞幸?实为网友玩梗:讽刺瑞幸多冰
一儿童高速驾车 副驾驶家长直言:龙王儿子必须得会浮水
10999元!拯救者R9000X 2023发布:AMD中国特供锐龙7 7840H
鼠标垫怎么清洗才能干净 鼠标垫怎么清洗
接口自动化测试框架实战训练营第一天
中华老字号:西安饭庄油泼biangbiang面4.9元/盒史低(不到半价)
车船税没白交 一电动出租车涉水漂过:燃油车主集体看呆
索尼音乐喜迎新人:甄子丹女儿官宣出道 仅19岁
回顾:当吴谢宇举起屠刀时,可否想到母亲养育自己的辛苦?人性之复杂难测,善与恶的较量,永无止境
1000元白菜价电视能买吗?这些信息必须掌握
16家网约车平台被约谈:落实降低过高抽成比例要求
凤凰传奇,幸亏没结婚
【技术实战】Vue技术实战【五】
机器人技术打破国外垄断 巨轮智能总经理意外去世:年仅45岁
这种无理数中的无理数 让数学家直呼根本停不下来
8月8日上市 荣耀MagicBook X Pro锐龙版2023亮相:首发MagicOS 7.2
印尼耍蛇人表演时试图亲吻蛇被咬死 眼镜王蛇有多毒:一滴致命
每周4班 哈尔滨至俄罗斯符拉迪沃斯托克航线复航
2230小尺寸 七彩虹新款PCIe 4.0 SSD上架:1TB售499元
2023暑期档票房破120亿:冠军35亿、《封神第一部》冲到第四
各路厂商争抢年轻用户!ChinaJoy 2023开展:ShowGirl小姐姐依然亮眼