改进SQL命令以按字母顺序显示前后值

时间:2017-01-24 15:48:16

标签: mysql alphabetical

使用以下两个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

&LT; 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 

&LT; 7.3961861133575

更新 Eplain of 1. query

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

2 个答案:

答案 0 :(得分:1)

如果您想更快地进行数据检索,这里有几个广泛的主题可以让您朝着正确的方向前进:

  1. 数据库是否在“足够强大”的计算机上运行?对于一个快速闪存的53K行表,即使是具有1核和4GB RAM的机器也会“足够强大”,除非机器被其他工作负载所淹没。

  2. 如果机器“足够强大”,那么您应该查看mysql表并检查执行计划(如果需要,请查看)。您需要做的一件非常常见的事情是检查您正在搜索/排序的列上是否存在 INDEX (在您的情况下为keyword)。 Here's a link on indexes in mysql

  3. 如果让数据库变得更快变得困难,你可以将 ALL 数据拉入PHP,如果执行PHP的机器“足够强大”,脚本应该能够管理53K值并在几毫秒而不是几秒内拉出“15之前,之后15”。至于你在PHP中如何做到这一点,这是一个PHP Tutorial page for SELECTing from a table的例子。

  4. 希望这能让你开始走上正确的道路。如果您仍然需要帮助,请询问!

答案 1 :(得分:1)

如果您正在寻找速度,请将列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的情况下执行类似的操作,可能更有效。

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