我有一张包含4.000.000条记录的表格。
我希望运行单个查询来选择男性成员
SELECT * FROM member WHERE gender='0' ORDER BY member_id DESC LIMIT 0,20;
执行此查询需要12秒。 我已经拥有INDEX with gender,member_id字段。 0:男 1:女性
Keyname Type Unique Packed Field Cardinality
gender BTREE No No gender 2
那么,我怎样才能加快这个问题:(
答案 0 :(得分:2)
您需要一个包含2个字段的索引: 性别,member_id DESC
这应该加快到几分之一秒。
SQL命令:
ALTER TABLE myTable ADD INDEX ( `gender` , `memcber_id` DESC )
答案 1 :(得分:1)
尝试编制member_id
索引。 gender
的低cardinality表示该列的索引没有帮助。不过,无论如何,这都是一个缓慢的查询,除非你可以为WHERE
子句添加额外的过滤器。
有关详细信息,请参阅:What makes a good MySQL index? Part 2: Cardinality
答案 2 :(得分:0)
我怀疑它应该花这么长时间。为什么不通过一次只扫描100K行来扫描部分内容(不要使用限制,这没有帮助)。您甚至可能希望按日期拆分(将被编入索引)。
你应该只使用夹头。无论如何你都不需要一次全部。此外,您可能没有足够的RAM用于键/重要数据。这是我今天写的实际代码
var offsetStep=5000;
for(int offset=0; offset<countOrMax; offset+=offsetStep)
{
using (var tns = conn.BeginTransaction())
{
var res = conn.Query<long>("select id from table1 where id>=@l and id<@u and t=@t", new { u = offset + offsetStep, l = offset, t = blah });
//work with chuck