MySQL - 基本2表查询慢 - 哪里,索引?

时间:2010-12-01 20:49:03

标签: mysql performance join query-optimization sql-execution-plan

我有一个MySQL 5.0查询定期需要14秒以上,从网页调用,用户不耐烦。这很简单,从2个表中选择11列。我有三个问题:

  1. 加入的位置是否重要?
  2. where子句的顺序是否重要,或者MySQL会优化吗?
  3. 在我的情况下会和索引有帮助吗?
  4. SQL:

    select table1.id, table1.DateOpened, table1.Status, table2.Name, etc
    from (table1 join table2 on((table1.CurrentName = table2.id))) 
    where table1.Type = 'Add' and (Status = 'Open' OR Status = 'Pending');
    

    表/列信息:

    table1 has 750,000 rows, table2 1.5M rows.
    indexed: table1.id, table2.id
    INT columns: id, table1.CurrentName
    table1.Status = always populated with 1 of 4 values, 
                    maybe 300 are 'Open' or 'Pending'
    table1.Type = 3 possible values: 'Add', 'Change', or null
    
    1. 在FROM中加入是否有任何优势,而在WHERE子句中添加'table1.CurrentName = table2.id'是什么?

    2. 有3个WHERE子句(使用连接)。我使用各种订单组合运行EXPLAIN,结果似乎相同。

    3. 我认为向table1.CurrentName添加一个索引可能会有所帮助,但现在我想不到。我修改了查询以删除对table2的引用,但它仍然运行缓慢。 (见3b)

    4. 似乎减速的大部分可能只是阅读800K记录,查看类型和状态值。索引这两列是否有意义,其中只有3或4个可能的值?我认为只有更多独特的价值观才有意义。

    5. 解释结果:

      +----+-------------+--------+--------+---------------+---------+---------+-----------------------+--------+-------------+ 
      | id | select_type | table  | type   | possible_keys | key     | key_len | ref                   | rows   | Extra       |         
      +----+-------------+--------+--------+---------------+---------+---------+-----------------------+--------+-------------+ 
      |  1 | SIMPLE      | table1 | ALL    | CurrentName   | NULL    | NULL    | NULL                  | 733190 | Using where | 
      |  1 | SIMPLE      | table2 | eq_ref | PRIMARY       | PRIMARY | 4       | db.table1.CurrentName | 1      |             | 
      +----+-------------+--------+--------+---------------+---------+---------+-----------------------+--------+-------------+ 
      2 rows in set (0.00 sec)
      

1 个答案:

答案 0 :(得分:2)

  

加入的位置是否重要?

他们写的顺序对INNER JOINs无关紧要。

  

where子句的顺序是否重要,或MySQL是否会优化?

没有。 WHERE子句中的书面顺序与MySQL查询解析器和优化器

无关
  

在我的情况下会和索引有帮助吗?

潜在。 table1上的复合索引type_status(Type,Status)可以提供帮助,因为这是WHERE子句可以减少读取的初始行的位置。

  

在FROM中加入是否有任何优势,而在WHERE子句中添加'table1.CurrentName = table2.id'是什么?

对于INNER JOIN,JOIN条件是否在FROM子句或WHERE子句中无关紧要。

  

我认为向table1.CurrentName添加一个索引可能会有所帮助,但现在我想不到。我修改了查询以删除对table2的引用,但它仍然运行缓慢。 (见3b)

table1.CurrentName上的索引对查询没有帮助。

  

似乎减速的大部分可能只是阅读800K记录,查看类型和状态值。

这加强了我上面的想法。要添加复合索引(在线可能不是一件好事),它就像

ALTER TABLE table1 ADD INDEX type_status (Type, Status);
  

我认为只有更多独特的价值观才有意义。

选择性肯定有帮助,但高基数不是唯一合适的背景。