gpt4 book ai didi

mysql - 有没有办法用 if 改进这个查询?

转载 作者:行者123 更新时间:2023-11-29 01:57:55 25 4
gpt4 key购买 nike

我使用此查询从包含多种语言字符串的数据库中选择一个语言字符串。数据库看起来像这样:

`string_id`   BIGINT
`language_id` BIGINT
`datetime` DATETIME
`text` TEXT

例如,数据可能如下所示:

`string_id` | `language_id` | `datetime`          | `text`
1 | 1 | 2014.04.22 14:43:00 | hello world
1 | 2 | 2014.04.22 14:43:02 | hallo welt

所以这是德语和英语的相同字符串。德文比英文改了两秒。

我使用这个 (sub) 查询来获取匹配字符串。如果请求的语言不存在,它会自动回退到任何语言。因此,例如,如果我在西类牙 (=id 3) 中请求字符串,此查询将回退到英语或德语:

SELECT
z.`text`
FROM
`language_strings` AS z
WHERE
a.`joined_string_id` = z.`string_id`
ORDER BY
IF(z.`language_id` = 3, 1, 0) DESC,
z.`datetime` DESC
LIMIT
1

此处的性能问题是,IF(..., 1, 0) 消除了很多机会,因为每次执行查询时都必须计算结果。

我尝试了很多来改进这个查询,仍然创建了所有有用的索引。 MySQL 能够使用内部缓存命中此查询,但如果没有缓存,则需要一些时间来计算。当获取大量行(例如 1000 行)时,这是一个性能问题,因为 MySQL 必须执行 1000 个子查询。

您知道如何改进此查询吗?我可以选择添加新列来存储预先计算的数据。

最佳答案

(SELECT
1 as ord, z.`text`
FROM
`language_strings` AS z
WHERE
a.`joined_string_id` = z.`string_id` and z.`language_id` = 3
limit 1)
union all
(SELECT
2 as ord, z.`text`
FROM
`language_strings` AS z
WHERE
a.`joined_string_id` = z.`string_id`
ORDER BY
z.`datetime` DESC
LIMIT 1)
ORDER BY ord
LIMIT 1

已更新。 Twinkles 谢谢你的留言。

关于mysql - 有没有办法用 if 改进这个查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23220227/

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