MYSQL 在优化器缺陷在次验证,与MYSQL 熄火了 还是 成熟了??

news2024/11/25 0:21:40

32f0a01611b1d7fb41479c9581d5e37f.png

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共850人左右 1 + 2 + 3)新人会进入3群。

上次在写了一篇关于MYSQL的优化器关于索引方面的问题的文章后,有同学说不对,当时答应在做更深入的测试,来深度证明MYSQL 的确在索引方面的一些问题。

我们还是产生1000万的数据,MYSQL 数据库版本8.030

CREATE TABLE `app_user` (

  `id` int NOT NULL AUTO_INCREMENT COMMENT '主键',

  `name` varchar(50) DEFAULT '' COMMENT '用户名称',

  `email` varchar(50) NOT NULL COMMENT '邮箱',

  `phone` varchar(20) DEFAULT '' COMMENT '手机号',

  `gender` tinyint DEFAULT '0' COMMENT '性别(0-男  :1-女)',

  `password` varchar(100) NOT NULL COMMENT '密码',

  `age` tinyint DEFAULT '0' COMMENT '年龄',

  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,

  `update_time` datetime DEFAULT CURRENT_TIMESTAMP,

  PRIMARY KEY (`id`),

  KEY `idx_app_name_email_phone_gender_age_create_time` (`name`,`email`,`phone`,`gender`,`age`,`create_time`),

  KEY `idx_app_name_email_phone_gender_age_create_time_pdate_time` (`name`,`email`,`phone`,`gender`,`age`,`create_time`,`update_time`)

) ENGINE=InnoDB AUTO_INCREMENT=11000001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='app用户表' 

SET GLOBAL log_bin_trust_function_creators=TRUE; 

DELIMITER $$   

CREATE FUNCTION mock_data()        

RETURNS INT                        

BEGIN                                

    DECLARE num INT DEFAULT 11000000;         

    DECLARE i INT DEFAULT 0; 

    WHILE i < num DO                

         INSERT INTO app_user(`name`,`email`,`phone`,`gender`,`password`,`age`) 

         VALUES(CONCAT('用户',i),'2548928007qq.com',CONCAT('18',FLOOR(RAND() * ((999999999 - 100000000) + 1000000000))),FLOOR(RAND()  *  2),UUID(),FLOOR(RAND()  *  100));

        SET i =  i + 1;      

    END WHILE;       

    RETURN i;

END;                  

DELIMITER $$

SELECT mock_data();

set session optimizer_trace = 'enabled=on';

针对以上的表进行查询

select * from app_user where name in ('用户1','用户2') and create_time = '2023-04-14';

通过trace 最终走了   name 与 create_time的索引

003cb536400957023dbb2e3b81776b47.png

我们调整索引将 name 和  create_time 的索引清理后, 在添加一个name ,phone,create_time 的索引,在使用同样的查询后,查询并没有在走我们新添加的索引,而是走了一个更大的索引  idx_app_name_email_phone_gender_age_create_time` (`name`,`email`,`phone`,`gender`,`age`,`create_time`) 而没有走  (name,phone,create_time) 索引,按照我们常人的思维模式,我在选择一个不能覆盖我所有查询返回值的情况下,我应该选择一个更小的索引,而让我占据的 share buffer pool , 而 MYSQL的优化器竟然选择了,不是最大的索引 也不是最小的索引,而是一个 13不靠的索引。

我们经过查询发现实际上,针对于MYSQL 索引的大小并在计算COST 中虽然三个索引都符合要求,但是在COST的计算上这三个索引的COST 是一点都不差。 但明眼人都看的出,这个索引本身在使用的时候是有差别的,根据查询的语句与索引的匹配,最优的 idx_name_phone_create_time,但是没有走。

3b4593a993f93cf86db28a938fb4ddbb.png

走了莫名其妙 idx_app_name_email_phone_gender_age_create_time

bf51fdb443117ff5cf101a51c0154b60.png

此时此刻我只想问一句, 麻烦8.030的版本的MYSQL 在优化器这个部分能稍微的在进步一点,或者解释一下,为什么最优的索引不是你的菜呢????而且使用三个索引的COST 是一样的????

所以问题 1 ,在多个都可以满足查询的索引在系统中,MYSQL 是无法分辨那个更好,选择的最终的索引,不是常理最优的原因不明。

26620002e5bf1e64ac5e0421d9624db8.png

来来来,贫道在来运行一遍,马上索引走了我们常理认为最优的索引。

eb1446cde56c6d7a3615b3f7ecfb33bb.png

为什么,为什么 ,为什么,难道MYSQL 吃仙风道骨这一套。来贫道再次来说说,上次有人说的,我说的不对的问题。

MYSQL 最终重新都了我们认为对的索引的原因是,那个短的索引中的行有一行中的PHONE 字段是 NULL,在我将NULL 那行的NULL的值补充后,再次进行查询,系统又走了我们认为应该走的索引。 

a29f4d8607728b5dea7b547c37ca5b1e.png

04ed21fa0aea7dae654495d3fefbe6d0.png

ebdc3d497b376b79dd5385391f287217.png

截止到目前,再次印证了上次的文章,和印证了MYSQL 优化器智商的缺陷的问题。

总结通过此测试获得的问题,1  存在NULL 的字段的索引,在查询中如果是最优选的索引,MYSQL 8.030 不会选择这个索引,而是选择一个比这个索引包含字段更多的索引。

2  我们将所有的索引删除,只留下这个一个有效索引,下图也再次证明如果走了相关的索引也不会走后面的时间部分,只会走NULL 值之前的字段,进行索引的查找。

67d6377e9b21762c806a9ff6efe0e3b9.png

MYSQL 8 中间字段有NULL 值,还是无法走索引,所以我高估了MYSQL 的查询智商

44479b0dd25900118b890207267cc93a.png

第二个标题关于MYSQL 熄火的了或成熟了问题,主要还是个人感受,5-10年前MYSQL 的各类社区是非常红火的,相关的培训也是如火如荼,各种传道解惑的文字,书籍非常的多,但最近1-2年,MYSQL的声音不知道为什么变的小了,社区的一些声音和以前相比,也变得温和了。 

个人感觉有几个原因

1  MYSQL 8的使用群体还是没有特别的大,很多企业还是在MYSQL5.7 上转悠,而基于MYSQL 5.7 的部分的文字,可以说基本上该写的都写了,问题该暴露的都暴露了。

2  MYSQL 的一些方案基本上人尽皆知,而一些新的方案如MYSQL 8 的MYSQL INNODB CLUSTER , MYSQL INNODB REPLIACTION 的方案使用的人或单位不多,并且大型的机构也不敢使用,也是基于mysql 8.029 的新闻。

507e54f384875f56948526a460799636.png

3  国产化的数据库产品中,POSTGRESQL  VS  MYSQL ,一般人都知道MYSQL 在这个进程中,是一个被抛弃的结果,这局POSTGRESQL 是稳赢的。

4   MYSQL 本身在数据库承载力上面是无法负担大型应用的,也是在一些大型项目中,MYSQL 不在是热点,这也是MYSQL 在持续降温的一个原因。

5   上云后,很多替代MYSQL的数据库产品,从性能,价格,成本等角度都比MYSQL RDS 的产品要好,也导致一部分 MYSQL 的项目使用分流了

终究30年河东 ,30年河西,MYSQL被替换的方案太多,MYSQL本身逐渐趋于平淡的时期也到来了。

c8d8fed2b73fa2131d13e411dff4e8e1.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/648321.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

聊聊我做 NeRF-3D重建性能优化经历

我们新推出大淘宝技术年度特刊《长期主义&#xff0c;往往从一些小事开始——工程师成长总结专题》&#xff0c;专题收录多位工程师真诚的心路历程与经验思考&#xff0c;覆盖终端、服务端、数据算法、技术质量等7大技术领域&#xff0c;欢迎一起沟通交流。 本文为此系列第四篇…

飞桨携手第二届GitLink开源夏令营,邀你参与顶尖开源项目!

想参与顶尖开源项目开发&#xff1f; 想熟悉开源社区参与流程&#xff1f; 想获得资深导师指导和丰厚现金奖励&#xff1f; 机会来啦&#xff01; 2016年9月&#xff0c;飞桨框架正式开源&#xff0c;其兼备易用性、高效性、灵活性和可扩展性等特点。如今&#xff0c;百度飞桨在…

软件工程:说透软件5种常见的部署策略

hi&#xff0c;我是熵减&#xff0c;见字如面。 在软件工程中&#xff0c;最终的价值交付&#xff0c;都是要通过软件的部署上线来完成的。 那如何将新的或改进的软件功能交付给用户&#xff0c;同时还要确保高质量、稳定性和用户体验&#xff0c;选择适当的部署策略变得至关重…

数字中国,开鸿见日

讲个小故事&#xff0c;《晋书乐广传》记载&#xff0c;西晋名士乐广&#xff0c;请大文学家潘岳替自己写一篇文章。潘岳让乐广把意思完完整整告诉他&#xff0c;再由他来动笔&#xff0c;最终写成了名扬当时的《呈太尉辞河南尹表》。时人看过这篇文章&#xff0c;评价乐广是“…

WPF开发txt阅读器5:书籍管理系统,文件夹对话框

文章目录 书柜类文件夹对话框验证 txt阅读器系列&#xff1a; 需求分析和文件读写目录提取类&#x1f48e;列表控件与目录字体控件绑定 书柜类 任何小说阅读器&#xff0c;都免不了要有一个书架功能&#xff0c;而所谓书架&#xff0c;其实就是一个文件夹&#xff0c;通过对…

postgre查询今天,昨天的数据

昨天数据 SELECT* FROMsys_device WHERE age(current_date,to_timestamp(substring(update_time FROM 1 FOR 10),yyyy-MM-dd)) 1 days; 今天数据 SELECT* FROMsys_device WHERE to_char(update_time:: DATE, yyyy-MM-DD hh 24: mi :s) to_char(CURRENT_DATE:: DATE, …

nodejs+vue+mysql汽车新闻资讯网站jtw43

本汽车资讯网站有管理员和用户。管理员功能有个人中心&#xff0c;用户管理&#xff0c;汽车品牌管理&#xff0c;价格分类管理&#xff0c;经销商管理&#xff0c;汽车信息管理&#xff0c;留言板管理&#xff0c;系统管理等。用户可以查看各种汽车信息&#xff0c;还可以进行…

无人机上仅使用CPU实时运行Yolov5(OpenVINO实现)(上篇)

Intel CPU在运行视觉导航等算法时实时性要优于Nvidia等平台&#xff0c;如Jetson Tx2&#xff0c;NX。而Nvidia平台在运行深度学习算法方面具有很大优势&#xff0c;两种平台各有利弊。但是&#xff0c;Intel OpenVINO的推出允许NUC平台实时运行深度学习模型&#xff0c;如目前…

Zookeeper 3.5.7

文章目录 1、Zookeeper 入门1.1 概述1.2 特点1.3 数据结构1.4 应用场景 2、本地安装2.1 本地模式安装2.2 配置参数解读 3、集群操作3.1 集群操作3.1.1 集群安装3.1.2 选举机制&#xff08;面试重点&#xff09;3.1.3 集群启停脚本 3.2 客户端命令行操作3.2.1 命令行语法3.2.2 z…

你没见过的黑科技,真会玩

很久之前分享过谷歌浏览器那些有趣的隐藏功能 &#xff0c;今天再分享几个浏览器黑科技。 第一个是这个项目https://github.com/zserge/awfice &#xff0c;利用data URI浏览器也可以当编辑器&#xff0c;输入data:text/html,<body contenteditable styleline-height:1.5;fo…

电力电子助力小米快充生态,磁材创新驱动未来无线充电

6月14日&#xff0c;第二届非晶合金材料在电力电子产业发展中的机遇与挑战研讨会于上海开幕。小米手机部工程师史学伟作为代表出席本次会议&#xff0c;并作《小米无线快充生态纳米晶合金材料应用及材料发展建议》主题报告&#xff0c;分享小米无线充电技术与产品应用&#xff…

【WinForm】C#实现商场收银软件,从面向过程到面向对象,设计模式的应用

文章目录 前言一、收银系统版本11、运行效果2、界面设计3、代码 二、收银系统版本21、运行效果2、界面设计3、代码&#xff1a; 三、收银系统版本31、运行效果2、界面设计3、代码 四、收银系统版本41、运行效果2、界面设计3、代码 总结面向对象23中设计模式总结设计模式关系图 …

C++类的成员变量和成员函数

类的成员变量和普通变量一样&#xff0c;也有数据类型和名称&#xff0c;占用固定长度的内存。但是在定义类的时候不能对成员变量赋值&#xff1b; 类的成员函数也和普通函数一样&#xff0c;都有返回值和参数列表&#xff0c;它与一般函数的区别是&#xff0c;成员函数是一个…

OpenAI深夜放毒:发布GPT-4新模型,GPT-3.5支持16K上下文,并且价格降低75%

一觉起来&#xff0c;发现OpenAI Twitter更新了&#xff0c;而且更新力度很大&#xff0c;这真是深夜放毒。 下面我们看下OpenAI本次的重大更新都有哪些&#xff1f; 函数调用能力 在Chat Completions API中引入了新的功能调用能力。gpt-4-0613和gpt-3.5-turbo-0613版本已进行了…

原创 | 一文读懂足球比赛中的随机博弈

作者&#xff1a;陈之炎本文约1500字&#xff0c;建议阅读5分钟 本文介绍了如何在足球比赛中读懂随机博弈。 据悉世界足坛的传奇球星梅西将于2023年6月中率领阿根廷国家足球队来到中国北京&#xff0c;参加一场备受瞩目的比赛。这场比赛成为了足球迷们心心念念的盛事&#xff0…

熬夜三晚之深度解析DuckDB MetaPipeline

深度解析DuckDB MetaPipeline 深度解析DuckDB MetaPipeline 1.导语 2.基础理论 3.HashJoin深度解析 3.1 RESULT_COLLECTOR 3.2 PROJECTION 3.3 HASH_JOIN 4.Ready 4.1 翻转 4.2 MetaPipeline与pipeline 5.汇总 1.导语 DuckDB 是…

用 ChatGPT 重构工作流程

如果你第一次听说 ChatGPT&#xff0c;那你要反思一下自己的信息获取渠道是不是出了问题&#xff0c;作为 AI 时代最强代表&#xff0c;你一定要亲自去体验一下&#xff0c;而不是道听途说。 公司需要降本增效&#xff0c;个体也一样&#xff0c;在工作中畅快应用 AI 来帮助自己…

chatgpt赋能python:Python断点调试指南:让调试更高效

Python断点调试指南&#xff1a;让调试更高效 在Python编程中&#xff0c;调试是一个必不可少的环节。当我们面临代码出现错误或程序不按预期运行时&#xff0c;如何快速找到问题&#xff0c;解决它们呢&#xff1f;这时候断点调试就发挥了重要的作用。本篇文章主要介绍Python…

NI VeriStand

概览 本文简要概述了NI VeriStand以及如何创建实时测试应用程序&#xff0c;并介绍如何结合NI LabVIEW等不同软件环境采用不同的方式创建额外的功能&#xff0c;如模型导入、FPGA功能自定义以及将NI LabVIEW Run-Time控件添加为工作区对象等。 内容 什么是NI VeriStand什么是…