如何使用哈希表优化查询速度

时间:2011-04-20 11:45:59

标签: mysql

大约有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%的数据,并且无论偏移如何都应该加快查询速度。

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

2 个答案:

答案 0 :(得分:2)

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

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哈希值通常比字符串本身短,因此哈希值上的索引查找比字符串上的查询更有效。

答案 1 :(得分:1)

哈希交替可能会有所帮助,但主要的瓶颈是当用户请求高$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的类型,但您可以应用相同的方法来加速您的分页。请记住,必须对该字段编制索引才能使其正常工作。