【发布时间】:2017-01-24 15:48:15
【问题描述】:
通过以下两个 SQL 命令,我按字母顺序查找显示的词条之前的 15 个词条和词条之后的 15 个词条。
关键字列已编入索引。执行时间已注明。
是否有更快或更好的解决方案在大型字母列表中查找多个前后值?
SELECT *
FROM
(SELECT
`keyword`, `num_keyword`,`stem`, `gram_1_word_group`
FROM
`ds_1_headword`
WHERE
`keyword` COLLATE `utf8_icelandic_ci` <= 'Patagónía'
ORDER BY
`keyword` COLLATE `utf8_icelandic_ci` DESC, `num_keyword`
LIMIT 15) AS `table`
ORDER BY
`keyword` COLLATE `utf8_icelandic_ci` ASC, `num_keyword
5.4222950935364
SELECT `keyword`, `num_keyword`,`stem`, `gram_1_word_group`
FROM `ds_1_headword`
WHERE `keyword` COLLATE `utf8_icelandic_ci` > 'Patagónía'
ORDER BY `keyword` COLLATE `utf8_icelandic_ci` ASC, `num_keyword` limit 15
7.3961861133575
如果我没记错的话,当列与查询中的排序规则相同时,这是冗余信息,可以删除,希望也可以更快。
SELECT *
FROM (SELECT `keyword`, `num_keyword`,`stem`, `gram_1_word_group`
FROM `ds_1_headword`
WHERE `keyword` <= 'Patagónía'
ORDER BY `keyword` desc, `num_keyword` limit 15) AS `table`
ORDER by `keyword` ASC, `num_keyword
SELECT `keyword`, `num_keyword`,`stem`, `gram_1_word_group`
FROM `ds_1_headword`
WHERE `keyword` > 'Patagónía'
ORDER BY `keyword` ASC, `num_keyword` limit 15
更新 1.查询说明
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 15 Using filesort
2 DERIVED ds_1_headword range keyword keyword 302 NULL 23205 Using where
2.查询的解释
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE ds_1_headword range keyword keyword 302 NULL 30646 Using where; Using filesort
【问题讨论】:
-
感谢您纠正问题。
-
您可以发布示例数据和预期结果吗?您的查询目前只会获得 15 个词条“紧接在前面”和“紧接在”字符串“Patagonia”之后。一次需要 2 x 15 = 30 条记录吗?您想知道为什么需要 5 秒和 7 秒吗?
-
没错,样本数据有问题 - 每次显示新词条时,我都会搜索 53000 条记录(也显示新的字母列表,其中包含 15 个前面和 15 个后面的词条)。是的,查询必须花费更少的时间。
-
如果整个列表只有 53K 行,您应该让应用程序加载所有这些行并在应用程序的内存中执行此操作 - 它应该快如闪电。此外,如果需要 5 秒,您的数据库似乎对这种类型的查询根本没有很好地优化。如果可以的话,你应该修复数据库;否则,在应用程序中做一个大的
SELECT并以应用程序使用的任何语言管理 53000 的列表,而不是这个性能不佳的 mysql 查询。您是否有能力修复数据库或应用程序开发人员,或两者兼而有之? -
如果我的评论正在为您提供答案,请告诉我,我很乐意以这种方式发布:)
标签: mysql alphabetical