我使用此查詢從包含多種語言的字符串的數據庫中選擇一種語言字符串。該數據庫是這樣的:有沒有辦法改善這個查詢,如果在它呢?
`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)查詢來獲得機加字符串。如果請求的語言不存在,它會自動回退到任何語言。因此,例如,這個查詢將回退到英語或德語,如果我requst西班牙的字符串(= 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個子查詢。
你知道如何改善這個查詢嗎?添加新列以存儲預先計算的數據對我來說是一種選擇。
您似乎認爲'UNION ALL'會保證結果集中的某個順序。我不認爲你是對的。 – Twinkles
@Twinkles已更新 – StanislavL