gpt4 book ai didi

DNF MySQL 优化提示

转载 作者:行者123 更新时间:2023-11-29 14:12:00 24 4
gpt4 key购买 nike

在 MYSQL 中,来自 Wordpress 插件的一些我不想更改太多的代码正在运行以下查询:

SELECT * WHERE cond1 AND (field1 = val1 OR field2 = val2)

但是,尽管 val1 和 val2 上有索引,但它运行速度非常慢。 (慢速查询日志确认它扫描了所有行。)我可以提示 MYSQL 它应该始终将公式扩展为以下等效但更快的形式吗?

SELECT * WHERE cond1 AND (field1 = val1)
UNION
SELECT * WHERE cond1 AND (field2 = val2)

这将显着减少扫描的行数,因此会产生极其优越的性能。我也有同样的疑问

SELECT * WHERE cond1 AND (field1 in (val1, val2))

谢谢!

编辑:有关表格和查询说明的一些信息位于 http://pastebin.com/Qd1ZaVKD但似乎不一致。如果我从 myphpadmin 运行查询,有时会生成慢速查询日志条目,有时则不会,即使在其他用户导致此类行时继续生成该条目也是如此。

最佳答案

它首先取决于 cond1,然后取决于该条件下 field1field2 的基数:

  1. 如果 cond1 涉及对具有常量值的列进行直接比较(即索引可以帮助解决该问题),则使用 field1 的复合索引和/或field2 可能会有所帮助(见下文)。

    如果 cond1 涉及对列的操作,例如应用函数或其他操作,例如 my_int + 5 = 3DATE(my_timestamp) > NOW() - 那么索引无济于事;但是,请注意,这两个示例都可以重写为索引友好型:

    • my_int = 3 - 5,显然等价于my_int = -2;和

    • my_timestamp >= CURDATE() + INTERVAL 1 天

  2. 只有创建具有相对较高基数的索引(即可以快速区分许多记录)才值得,否则使用它比全表扫描好不了多少,同时会减慢表写入操作并消耗额外的存储空间内存空间。不仅要考虑 cond1field1field2 的基数,还要考虑 cond1 以及每个的基数字段。

    假设它们都具有高基数,您最好的选择是实现 index_merge (union access) (cond1, field1)(cond1, field2) 各有两个复合索引。

关于DNF MySQL 优化提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13336472/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com