【问题标题】:How to optimize the query speed by using hashtable如何使用哈希表优化查询速度
【发布时间】:2011-04-20 11:45:58
【问题描述】:

大约有 100 万条记录。分页系统需要查询。

查询如下所示:

SELECT field1, field2, field3 FROM table 
WHERE field4 = '$value' 
ORDER BY field5 ASC limit $offset, 30;

field4 和 field5 上有索引。

我听说了:

制作另一个表(表 6),它是 table4 的索引散列?

搜索数字而不是文本会快很多,所以查询类似于:

SELECT field1, field2, field3 Force
Index(Table6) FROM table WHERE field 6
= '$hashvalue' AND field4 = '$value' ORDER BY field5 ASC limit $offset, 30;

它应该有助于在必须进行文本搜索之前消除 99.99% 的数据,并且无论偏移量如何都应该加快您的查询速度。

我应该如何实现它?你能帮我理解这个例子中哈希表的概念吗?

【问题讨论】:

  • field4和field5上有索引吗?是index(field4, field5) 还是index(field4) index(field5)
  • 我尝试了两个版本。观察到类似的加载时间。目前使用 index(field4, field5) 因为我知道它应该工作得更好还是?
  • 使用EXPLAIN,看看查询执行计划是否不同
  • 如果是高偏移量导致速度变慢,您可能对 MySQL 中的延迟行查找技巧感兴趣,如 explainextended.com/2011/02/11/late-row-lookups-innodb 中所述

标签: mysql


【解决方案1】:

我相信作者的意思是哈希索引,而不是哈希表:

ALTER TABLE mytable ADD field4_hash BINARY(16);

UPDATE mytable SET field4_hash = UNHEX(MD5(field4));

CREATE INDEX ix_mytable_field4hash_field5 ON mytable (field4_hash, field5)

SELECT  field1, field2, field3
FROM    mytable 
WHERE   field4_hash = UNHEX(MD5('$value'))
        AND field4 = '$value'
ORDER BY
        field5 ASC
LIMIT   $offset, 30;

这个想法是,字符串的MD5 散列通常比字符串本身短,因此散列上的索引查找比字符串上的索引查找更有效。

【讨论】:

  • 谢谢,我会试试的。无论偏移量如何,它是否有助于加快查询速度或只是提供总体改进?
【解决方案2】:

哈希交替可能会有所帮助,但主要瓶颈将是当用户请求高 $offset 时。
在这种情况下,明智的做法是使用 id 自动递增主键,您可以使用它来执行分页。看这个例子

select id, name
FROM table
LIMIT 0, 3;

返回类似于

+----+-----------------------------------+
| id | name                              |
+----+-----------------------------------+
|  1 | Beauty                            |
|  4 | Goodbye Country (Hello Nightclub) |
|  5 | Glee                              |
+----+-----------------------------------+

你可以看到最后一个ID是5。当用户请求第二页时,而不是像这样查询

select id, name
FROM table
LIMIT 3, 3;

你可以写这个查询

select id, name
FROM table
WHERE id > 5
LIMIT 0, 3;

因为最后一个 ID 是 5,写入 WHERE id > 5 会直接返回第一页最后一行之后的行,代表用户希望在第二页上看到的行。

如果您要使用第一个查询 (LIMIT 3,3),MySQL 必须在第一页上找到前 3 行才能确定 4-6 行是什么。

您没有提到field5 的类型是什么,但您可以应用相同的方法来加快分页速度。请记住,必须对该字段进行索引才能使其正常工作。

【讨论】:

  • 我目前正在使用field4 = '$value' and id > $offset limit 30。它有点帮助,但对于 1000、2000、3000 等非常高的偏移量(加载时间在那里有很多秒),第一页加载时间为 0.01。
  • @Newbie1 确保 id 已编入索引
  • 另一件事是,当使用field4 = '$value' and id > $offset limit 30 时,无法使用order by 并得到有序结果。
  • 即使你这样做id > $offset limit 30,如果你需要,你仍然可以order by id。没有限制。但正如约翰所说,确保 ID 是自动增量主键。你用什么引擎做桌子? InnoDB 还是 MyISAM?
猜你喜欢
  • 2014-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-11
  • 2019-10-13
  • 2017-12-22
  • 2019-08-30
  • 2016-02-29
相关资源
最近更新 更多