为什么不使用MySQL索引合并?

为什么不使用MySQL索引合并?,mysql,ubuntu,Mysql,Ubuntu,使用表结构,如中所示 为什么使用的索引仅为公司id,而未使用创建的索引 为什么在我的机器上,使用完全相同的表结构和查询,在“可能的\u键”列中只显示公司\u id?MySQL版本:5.5.24-0ubuntu0.12.04.1-log(Ubuntu) MySQL根据表中的统计信息确定在运行时使用哪个索引。根据数据选择不同的查询计划是正常的 对于这个查询,它必须使用intersect索引合并,这不是很有效,它决定(正确与否)不这样做 如果您在(公司id,状态,已创建)上创建索引会更好。这样,它将能

使用表结构,如中所示

  • 为什么使用的索引仅为公司id,而未使用创建的索引

  • 为什么在我的机器上,使用完全相同的表结构和查询,在“可能的\u键”列中只显示公司\u id?MySQL版本:5.5.24-0ubuntu0.12.04.1-log(Ubuntu)


  • MySQL根据表中的统计信息确定在运行时使用哪个索引。根据数据选择不同的查询计划是正常的

    对于这个查询,它必须使用intersect索引合并,这不是很有效,它决定(正确与否)不这样做

    如果您在
    (公司id,状态,已创建)
    上创建索引会更好。这样,它将能够直接从索引中过滤结果


    我想不出为什么只有一个键会尽可能地出现(假设您真的有两个键)。

    MySQL根据表中的统计信息确定在运行时使用哪个索引。根据数据选择不同的查询计划是正常的

    对于这个查询,它必须使用intersect索引合并,这不是很有效,它决定(正确与否)不这样做

    如果您在
    (公司id,状态,已创建)
    上创建索引会更好。这样,它将能够直接从索引中过滤结果


    我想不出为什么只有一个键会尽可能的出现(假设你真的有两个键)。

    我很确定你遇到了一个错误,这个错误出现在5.5中,并用5.6修复。这里,当使用与
    utf8\u general\u ci
    不同的排序规则时,不使用datetime列上的索引。请参阅以下链接:和

    对于在最左边有datetime值的组合索引也是如此。因此,一个可能的解决方案是创建一个不以datetime开头的组合索引。请参阅下面使用上面示例的测试会话示例

    因此,在您的情况下,我会尝试使用Vatev建议的组合索引,但请记住不要以datetime列开始。如果使用此索引,它将取决于优化器。但它将被列为可能的关键。一个不同的解决方案是使用5.1.xx或5.6(只有机会根据5.6.12进行验证,但错误报告指出它不会发生在5.1.60中)


    我很确定你遇到了一个bug,这个bug出现在5.5中,用5.6修复。这里,当使用与
    utf8\u general\u ci
    不同的排序规则时,不使用datetime列上的索引。请参阅以下链接:和

    对于在最左边有datetime值的组合索引也是如此。因此,一个可能的解决方案是创建一个不以datetime开头的组合索引。请参阅下面使用上面示例的测试会话示例

    因此,在您的情况下,我会尝试使用Vatev建议的组合索引,但请记住不要以datetime列开始。如果使用此索引,它将取决于优化器。但它将被列为可能的关键。一个不同的解决方案是使用5.1.xx或5.6(只有机会根据5.6.12进行验证,但错误报告指出它不会发生在5.1.60中)


    数据库和客户端连接的排序规则是什么?我需要这些信息,因为我认为您遇到了5.5中存在的一个bug。@FloDoe
    >显示变量,如“%collation%”;+-----------------------------------------++变量|名称|值|+--------------------------------------------+|排序规则|连接| utf8 | unicode | ci |排序规则|数据库| utf8 | unicode | ci |--------------------+3行(0.00秒)
    数据库和客户端连接的排序规则是什么?我需要这些信息,因为我认为您遇到了5.5中存在的一个bug。@FloDoe
    >显示变量,如“%collation%”;+-----------------------------------------++变量|名称|值|+--------------------------------------------+|排序规则|连接| utf8 | unicode | ci |排序规则|数据库| utf8 | unicode | ci |+---------------------------------------+3行(0.00秒)
    mysql> SHOW VARIABLES LIKE "version";
    +---------------+------------+
    | Variable_name | Value      |
    +---------------+------------+
    | version       | 5.5.28-log |
    +---------------+------------+
    1 row in set (0.00 sec)
    
    mysql> show variables like '%collation%';
    +----------------------+-------------------+
    | Variable_name        | Value             |
    +----------------------+-------------------+
    | collation_connection | utf8_general_ci   |
    | collation_database   | latin1_swedish_ci |
    | collation_server     | latin1_swedish_ci |
    +----------------------+-------------------+
    3 rows in set (0.00 sec)
    
    mysql> CREATE TABLE tbl (
        ->   id int(11) not null auto_increment PRIMARY KEY,
        ->   user_id int(11) not null,
        ->   company_id int (11) NOT NULL,
        ->   created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
        ->   oid int(11) NOT NULL,
        ->   did varchar(100) NOT NULL,
        ->   status int(11) NOT NULL,
        ->   KEY company_id (company_id),
        ->   KEY user_id (user_id),
        ->   KEY created (created),
        ->   KEY operator_id (oid),
        ->   KEY did (did)
        -> );
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> EXPLAIN SELECT DATE_FORMAT(created, '%M %d, %Y') as date, count(id) as num_accepted FROM tbl WHERE created BETWEEN '2013-06-29' AND '2013-07-30' AND company_id = 20 AND (status in (2,5))  GROUP BY `date` ORDER BY created ASC;
    +----+-------------+-------+------+--------------------+------------+---------+-------+------+----------------------------------------------+
    | id | select_type | table | type | possible_keys      | key        | key_len | ref   | rows | Extra                                        |
    +----+-------------+-------+------+--------------------+------------+---------+-------+------+----------------------------------------------+
    |  1 | SIMPLE      | tbl   | ref  | company_id,created | company_id | 4       | const |    1 | Using where; Using temporary; Using filesort |
    +----+-------------+-------+------+--------------------+------------+---------+-------+------+----------------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> SET collation_connection = utf8_unicode_ci;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> EXPLAIN SELECT DATE_FORMAT(created, '%M %d, %Y') as date, count(id) as num_accepted FROM tbl WHERE created BETWEEN '2013-06-29' AND '2013-07-30' AND company_id = 20 AND (status in (2,5))  GROUP BY `date` ORDER BY created ASC;
    +----+-------------+-------+------+---------------+------------+---------+-------+------+----------------------------------------------+
    | id | select_type | table | type | possible_keys | key        | key_len | ref   | rows | Extra                                        |
    +----+-------------+-------+------+---------------+------------+---------+-------+------+----------------------------------------------+
    |  1 | SIMPLE      | tbl   | ref  | company_id    | company_id | 4       | const |    1 | Using where; Using temporary; Using filesort |
    +----+-------------+-------+------+---------------+------------+---------+-------+------+----------------------------------------------+
    1 row in set (0.00 sec)