Mysql ke community wiki,您也必须更改答案-这是一个新功能。我想您在更新中的意思是value1,value2,是吗?没关系,因为@Quassnoi对value1范围的解释,这根本不起作用。对于value1的单个值来说,它是有效的,但是我没有足够好

Mysql ke community wiki,您也必须更改答案-这是一个新功能。我想您在更新中的意思是value1,value2,是吗?没关系,因为@Quassnoi对value1范围的解释,这根本不起作用。对于value1的单个值来说,它是有效的,但是我没有足够好,mysql,performance,optimization,Mysql,Performance,Optimization,ke community wiki,您也必须更改答案-这是一个新功能。我想您在更新中的意思是value1,value2,是吗?没关系,因为@Quassnoi对value1范围的解释,这根本不起作用。对于value1的单个值来说,它是有效的,但是我没有足够好地阅读这个问题。祝您好运。您是直接在查询中使用字段还是使用函数?类似于时间戳字段和星期(timestamp)。没有使用任何函数。+1个写得很好的问题谢谢你的全面回答。假设我无法更改所使用的SQL查询(这些查询是由Hibernate自动生成的),


ke community wiki,您也必须更改答案-这是一个新功能。我想您在更新中的意思是value1,value2,是吗?没关系,因为@Quassnoi对value1范围的解释,这根本不起作用。对于value1的单个值来说,它是有效的,但是我没有足够好地阅读这个问题。祝您好运。您是直接在查询中使用字段还是使用函数?类似于时间戳字段和星期(timestamp)。没有使用任何函数。+1个写得很好的问题谢谢你的全面回答。假设我无法更改所使用的SQL查询(这些查询是由Hibernate自动生成的),您是否认为这是不可能解决的(通过添加更好的索引)?另一个问题:如果范围查询是问题所在,那么在不使用ORDER by时,为什么一切看起来都正常?如果我错过了这个细节,很抱歉。因为索引仍然用于过滤,如您第二次解释所示。在您的查询中,ORDER BY不使用索引,不使用WHERE。我认为不重写查询就无法提高性能。您甚至无法创建视图,因为它将使用MySQL不允许在视图中使用的嵌套子查询。我对Hibernate没有深入的了解,但我认为可以使用自定义SQL:。再说一次,这只是我在谷歌上搜索的东西,我没有在实践中尝试过。 CREATE TABLE values_table ( id int(11) NOT NULL auto_increment, ... value1 int(10) unsigned NOT NULL default '0', value2 int(11) NOT NULL default '0', PRIMARY KEY (id), KEY value1 (value1), KEY value2 (value2), ) ENGINE=MyISAM AUTO_INCREMENT=2364641 DEFAULT CHARSET=utf8; OK, when NOT using ORDER BY: EXPLAIN select ... from values_table this_ where this_.value1 between 12345678 and 12349999 limit 10; +----+-------------+-------+-------+---------------+----------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+----------+---------+------+------+-------------+ | 1 | SIMPLE | this_ | range | value1 | value1 | 4 | NULL | 3303 | Using where | +----+-------------+-------+-------+---------------+----------+---------+------+------+-------------+ However, when using ORDER BY I get "Using filesort": EXPLAIN select ... from values_table this_ where this_.value1 between 12345678 and 12349999 order by this_.value2 asc limit 10; +----+-------------+-------+-------+---------------+----------+---------+------+------+-----------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+----------+---------+------+------+-----------------------------+ | 1 | SIMPLE | this_ | range | value1 | value1 | 4 | NULL | 3303 | Using where; Using filesort | +----+-------------+-------+-------+---------------+----------+---------+------+------+-----------------------------+ SELECT MIN(value1), MAX(value1) FROM values_table; +---------------+---------------+ | MIN(value1) | MAX(value2) | +---------------+---------------+ | 0 | 4294967295 | +---------------+---------------+ ... SELECT MIN(value2), MAX(value2) FROM values_table; +---------------+---------------+ | MIN(value2) | MAX(value2) | +---------------+---------------+ | 1 | 953359 | +---------------+---------------+
CREATE TABLE values_table (
    id int(11) NOT NULL auto_increment,
    ...
    value1 int(10) unsigned NOT NULL default '0',
    value2 int(11) NOT NULL default '0',
    PRIMARY KEY  (id),
    KEY value1 (value1),
    KEY value1and2 (value1,value2),
) ENGINE=MyISAM AUTO_INCREMENT=2364641 DEFAULT CHARSET=utf8;
SELECT  *
FROM    values_table this_
WHERE   this_.value1 = @value
ORDER BY
        value2
LIMIT 10
value1 value2 ----- ------ 1 10 1 20 1 30 1 40 1 50 1 60 2 10 2 20 2 30 3 10 3 20 3 30 3 40
CREATE INDEX ix_table_value2_value1 ON mytable (value2, value1)

/* Note the order, it's important */    

SELECT  *
FROM    (
        SELECT  DISTINCT value2
        FROM    mytable
        ORDER BY
                value2
        ) q,
        mytable m
WHERE   m.value2 >= q.value2
        AND m.value2 <= q.value2
        AND m.value1 BETWEEN 13123123 AND 123123123
m.value2 >= q.value2
AND m.value2 <= q.value2
m.value2 = q.value2