为表4.000.000记录优化Mysql

时间:2012-10-10 17:46:14

标签: mysql optimization where

我有一张包含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

那么,我怎样才能加快这个问题:(

3 个答案:

答案 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