改进 SQL 命令以按字母顺序显示前后值
Improving the SQL commands to display preceding and following values in alphabetical order
使用以下两个 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
<5.4222950935364
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
<7.3961861133575
更新
1.查询Eplain
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
如果您想加快数据检索速度,这里有几个广泛的主题应该可以让您朝着正确的方向迈进:
数据库 运行 是否在 "powerful enough" 的机器上?对于 53K 行 table 要快如闪电,即使是具有 1 个内核和 4GB RAM 的机器也是 "powerful enough" 除非机器被其他工作负载淹没。
如果机器是"powerful enough",那你应该看看mysqltable,检查执行计划(如果需要,请查找)。您需要做的一件非常常见的事情是检查您所在的列上是否有 INDEX searching/sorting(在您的情况下为 keyword
)。 Here's a link on indexes in mysql
如果让数据库变得更快变得困难,你可以直接将ALL数据拉入PHP,如果机器执行PHP 是 "powerful enough",脚本应该能够管理 53K 值并在几毫秒而不是几秒内提取“前 15 个,后 15 个”。至于如何在 PHP 中执行此操作,这里有一个 PHP Tutorial page for SELECTing from a table.
的示例
希望这能让您走上正确的道路。如果您仍然需要帮助,尽管问!
如果您追求速度,请将 keyword
列声明为 CHARACTER SET utf8 COLLATION utf8_icelandic_ci
。
通过在查询中声明不同的排序规则,无法使用索引,因此您正在扫描整个 table。
要获取给定单词前后的 15 行(加上给定的行),这是最佳的:
( SELECT `keyword`, `num_keyword`,`stem`, `gram_1_word_group`
FROM ds_1_headword
WHERE keyword < 'Patagónía'
ORDER BY keyword DESC LIMIT 15 )
UNION ALL
( SELECT `keyword`, `num_keyword`,`stem`, `gram_1_word_group`
FROM ds_1_headword
WHERE keyword >= 'Patagónía'
ORDER BY keyword ASC LIMIT 16 )
ORDER BY keyword; -- assuming you want the result sorted
MariaDB 10.0.2 有“窗口函数,它可以在没有 UNION
的情况下做类似的事情,可能效率更高。
如果您需要按各种排序规则对 相同的 列进行排序,那您就不走运了。重新考虑架构(添加更多列?)and/or 要求(不需要多个排序规则?)。
使用以下两个 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
<5.4222950935364
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
<7.3961861133575
更新 1.查询Eplain
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
如果您想加快数据检索速度,这里有几个广泛的主题应该可以让您朝着正确的方向迈进:
数据库 运行 是否在 "powerful enough" 的机器上?对于 53K 行 table 要快如闪电,即使是具有 1 个内核和 4GB RAM 的机器也是 "powerful enough" 除非机器被其他工作负载淹没。
如果机器是"powerful enough",那你应该看看mysqltable,检查执行计划(如果需要,请查找)。您需要做的一件非常常见的事情是检查您所在的列上是否有 INDEX searching/sorting(在您的情况下为
keyword
)。 Here's a link on indexes in mysql如果让数据库变得更快变得困难,你可以直接将ALL数据拉入PHP,如果机器执行PHP 是 "powerful enough",脚本应该能够管理 53K 值并在几毫秒而不是几秒内提取“前 15 个,后 15 个”。至于如何在 PHP 中执行此操作,这里有一个 PHP Tutorial page for SELECTing from a table.
的示例
希望这能让您走上正确的道路。如果您仍然需要帮助,尽管问!
如果您追求速度,请将 keyword
列声明为 CHARACTER SET utf8 COLLATION utf8_icelandic_ci
。
通过在查询中声明不同的排序规则,无法使用索引,因此您正在扫描整个 table。
要获取给定单词前后的 15 行(加上给定的行),这是最佳的:
( SELECT `keyword`, `num_keyword`,`stem`, `gram_1_word_group`
FROM ds_1_headword
WHERE keyword < 'Patagónía'
ORDER BY keyword DESC LIMIT 15 )
UNION ALL
( SELECT `keyword`, `num_keyword`,`stem`, `gram_1_word_group`
FROM ds_1_headword
WHERE keyword >= 'Patagónía'
ORDER BY keyword ASC LIMIT 16 )
ORDER BY keyword; -- assuming you want the result sorted
MariaDB 10.0.2 有“窗口函数,它可以在没有 UNION
的情况下做类似的事情,可能效率更高。
如果您需要按各种排序规则对 相同的 列进行排序,那您就不走运了。重新考虑架构(添加更多列?)and/or 要求(不需要多个排序规则?)。