mysql 优化 难题(mysql 优化问题)?

2023-03-16 18:27:45 4

在介绍键租谨的演示之前,我们需要先了解两个概念。第一个概念是数据的可选择性基数,也就是所谓的cardinality值。查询优化器在生成各种执行计划之前,需要从统计信息中获取相关数据,以便于估计每个操作所涉及到的记录数。而这个相关数据就是cardinality值。简单来说,它表示每个字段中唯一值的分布情况。例如,如果表t1有100行记录,其中一列为f1。f1中唯一值的个数可以是100个,也可以是1个,还可以是1到100之间的任何数字。这里,唯一值越多,就表示该列的可选择基数越高。那么,为什么要在可选择基数高的字段上建立索引,而在可选择基数低的字段上建立索引反倒比全表扫描更慢呢?当然,这只是其中的一方面,更深入的探讨超出了本篇文章的讨论范畴。

第二个概念是关于HINT的使用。在这里,我将解释HINT是什么,以及在什么情况下需要使用它。HINT简单来说是人为指示MySQL优化器在特定场景下生成最优执行计划的方式。通常情况下,优化器生成的执行计划都是最优的。但在某些特定场景下,执行计划可能不是最优的。例如,当表t1经过大量更新操作(UPDATE、DELETE和INSERT),cardinality值已经非常不准确时,此时执行一条SQL语句就可能会生成非最优执行计划。怎么样才能判断执行计划是否最优呢?举个例子,假设有以下两条SQL语句:

A:select * from t1 where f1 = 20;

B:select * from t1 where f1 = 30;

如果在f1列中频繁更新的值为30,而且未达到MySQL自动更新cardinality值的临界点,或者用户设置了手动更新,甚至减少了样本页等等,那么这两条语句中不准确的可能就是B语句。此外,MySQL还提供了自动更新和手动更新表cardinality值的方法,相关信息可以在手册中查阅。

回到正题,MySQL 8.0引入了一些新的HINT,在这里以index_merge为例进行演示。下面是示例表的结构:mysql。

爱网站

Linux、centOS、Ubuntu、Windows操作系统下的ECS云服务器、vps虚拟空间、建站主机到期停止异常等状态监测,宝塔面板Bt、小皮面板PHPStudy、IIS、Apache、Nginx、XAMPP、wamp建站环境意外故障监测,php+MySql、asp、java、html等建站程序运行故障监测,域名状态、SSL证书状态监测,网站301、302、404、500错误代码及网站无法访问通知提醒,全国多节点测试网站速度及网络攻击!

网站服务

扫一扫,关注我们

桂ICP备2022009721号-1