大约有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%的数据,并且无论偏移如何都应该加快查询速度。
我应该如何实施它?在这个例子中,您能帮我理解哈希表的概念吗?
答案 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
的类型,但您可以应用相同的方法来加速您的分页。请记住,必须对该字段编制索引才能使其正常工作。