0

我有一张有 4.000.000 条记录的表。

我想运行单个查询来选择男性成员

SELECT * FROM member WHERE gender='0' ORDER BY member_id DESC LIMIT 0,20;

执行此查询需要 12 秒。我已经有了带有性别、成员 ID 字段的索引。0:男 1:女

Keyname Type    Unique  Packed  Field   Cardinality
gender  BTREE   No  No  gender  2

所以,我怎样才能加快这个查询:(

4

3 回答 3

2

您需要一个包含 2 个字段的索引:gender、member_id DESC

这应该将其加速到几分之一秒。

SQL 命令:

ALTER TABLE  myTable ADD INDEX (  `gender` ,  `memcber_id` DESC )
于 2012-10-10T17:48:18.810 回答
1

尝试仅索引member_id. 的低基数意味着该列上gender的索引将无济于事。无论如何,这将是一个缓慢的查询,除非您可以向WHERE子句添加额外的过滤器。

有关更多信息,请参阅:什么是好的 MySQL 索引?第 2 部分:基数

于 2012-10-10T17:51:43.613 回答
0

我怀疑它应该花这么长时间。你为什么不通过一次只扫描 100K 行来扫描它的一部分(不要使用限制,这没有帮助)。您甚至可能希望按日期(将被编入索引)拆分内容。

你应该只使用夹头。无论如何,您不需要一次全部。此外,您可能没有足够的内存来存储密钥/重要数据。这是我今天写的实际代码

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
于 2012-10-10T18:22:29.750 回答