【发布时间】:2019-12-19 11:42:09
【问题描述】:
当我在 SQLite 中使用 LIKE 运算符时,与我使用 = 时相比,它非常慢。
使用 = 运算符大约需要 14 毫秒,但是当我使用 LIKE 时,大约需要 440 毫秒。我正在使用DB Browser for SQLite 对此进行测试。这是运行速度很快的查询:
SELECT re.ENTRY_ID,
GROUP_CONCAT(re.READING_ELEMENT, '§') AS read_element,
GROUP_CONCAT(re.FURIGANA_BOTTOM, '§') AS furigana_bottom,
GROUP_CONCAT(re.FURIGANA_TOP, '§') AS furigana_top,
GROUP_CONCAT(re.NO_KANJI, '§') AS no_kanji,
GROUP_CONCAT(re.READING_COMMONNESS, '§') AS read_commonness,
GROUP_CONCAT(re.READING_RELATION, '§') AS read_rel,
GROUP_CONCAT(se.SENSE_ID, '§') AS sense_id,
GROUP_CONCAT(se.GLOSS, '§') AS gloss,
GROUP_CONCAT(se.POS, '§') AS pos,
GROUP_CONCAT(se.FIELD, '§') AS field,
GROUP_CONCAT(se.DIALECT, '§') AS dialect,
GROUP_CONCAT(se.INFORMATION, '§') AS info
FROM Jmdict_Reading_Element AS re LEFT JOIN
Jmdict_Sense_Element AS
se ON re.ENTRY_ID = se.ENTRY_ID
WHERE re.ENTRY_ID IN (SELECT ENTRY_ID FROM Jmdict_Reading_Element WHERE READING_ELEMENT = 'example') OR
re.ENTRY_ID IN (SELECT ENTRY_ID FROM Jmdict_Sense_Element WHERE GLOSS = 'example')
GROUP BY re.ENTRY_ID
当我改变时会变慢
WHERE re.ENTRY_ID IN (SELECT ENTRY_ID FROM Jmdict_Reading_Element WHERE READING_ELEMENT = 'example') OR
re.ENTRY_ID IN (SELECT ENTRY_ID FROM Jmdict_Sense_Element WHERE GLOSS = 'example')
到
WHERE re.ENTRY_ID IN (SELECT ENTRY_ID FROM Jmdict_Reading_Element WHERE READING_ELEMENT LIKE 'example') OR
re.ENTRY_ID IN (SELECT ENTRY_ID FROM Jmdict_Sense_Element WHERE GLOSS LIKE 'example')
我需要这样做才能使用通配符,例如
WHERE re.ENTRY_ID IN (SELECT ENTRY_ID FROM Jmdict_Reading_Element WHERE READING_ELEMENT LIKE 'example%') OR
re.ENTRY_ID IN (SELECT ENTRY_ID FROM Jmdict_Sense_Element WHERE GLOSS LIKE 'example%')
这是数据库本身的链接: https://www.mediafire.com/file/hyuymc84022gzq7/dictionary.db/file
谢谢
【问题讨论】:
标签: sql performance sqlite database-performance sqlperformance