gpt4 book ai didi

mysql - 改进 SQL 命令以按字母顺序显示前面和后面的值

转载 作者:行者123 更新时间:2023-11-29 07:05:36 25 4
gpt4 key购买 nike

通过以下两个 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.查询说明

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

最佳答案

如果您追求速度,请将keyword列声明为CHARACTER SET utf8 COLLATION utf8_icelandic_ci

通过在查询中声明不同的排序规则,无法使用索引,因此您将扫描整个表。

要获取给定单词之前和之后的 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 即可完成类似的操作,甚至可能更高效。

如果您需要通过多种排序规则对相同列进行排序,那么您就不走运了。重新考虑架构(添加更多列?)和/或要求(不需要多个排序规则?)。

关于mysql - 改进 SQL 命令以按字母顺序显示前面和后面的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41832427/

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