我有A,B两张表。
A表有字段ID,A1,A2,A3....(2000W数据,没有主键,索引是ID)
B表有字段ID,B1,B2,B3....(2000W数据,没有主键,索引是ID)
B里面的ID都来自A里面的ID,但B里面的ID可能重复,有2,3的情况。现在我关联两张表查询语句如下:
select count(*)
from A,B
where A.ID = B.ID居然用了8个小时,这正常吗?
如果正常的话,怎么能调高查询效率。

解决方案 »

  1.   

    什么引擎,COUNT比较难优化
    EXPLAIN select count(*)
    from A,B
    where A.ID = B.ID贴结果
      

  2.   

    explain select count(*)
    from A,B
    where A.ID=B.id
    贴出执行计划
      

  3.   

    要达到什么目的,统计B表记录中有多少条与A表的ID相同?
      

  4.   


    普通的开发机器
    CPU:i52400 3.1G
    内存4G
      

  5.   

    | id | select_type | table | type | possible_keys  | key            | key_len | ref
    +----+-------------+-------+------+----------------+----------------+---------+---------------------
    |  1 | SIMPLE      | A  | ALL  | NULL           | NULL           | NULL    | NULL
    |  1 | SIMPLE      | B   | ref  | index_uniqueID | index_uniqueID | 153     | databasename.A.uniqueID
      

  6.   

    我也在考虑这个问题,
    A表的主键好说,可以用ID,因为ID不重复,
    B表中主键是个问题啊,ID有可能重复。A表和B表的ID几乎一样,2000W的数据量估计会有1W的不一样,不过这不是大问题吧?
      

  7.   

    检查 一下A表的索引情况
    SHOW INDEX FROM a
      

  8.   


    貌似是这个问题,我刚发现A的索引居然没有ID。
      

  9.   

    先创建索引,然后再看你的explain select count(*)
    from A,B
    where A.ID=B.id
      

  10.   

    mysql> explain explain select count(*)
    from A,B
    where A.ID=B.id+----+-------------+-------+-------+----------------+----------------+---------+----------------------+----------+--------------------------+
    | id | select_type | table | type  | possible_keys  | key            | key_len | ref                  | rows     | Extra                    |
    +----+-------------+-------+-------+----------------+----------------+---------+----------------------+----------+--------------------------+
    |  1 | SIMPLE      | A     | index | index_uniqueID | index_uniqueID | 452     | NULL                 | 18364876 | Using index              |
    |  1 | SIMPLE      | B     | ref   | index_uniqueID | index_uniqueID | 453     | db.a.uniqueID        |        1 | Using where; Using index |
    +----+-------------+-------+-------+----------------+----------------+---------+----------------------+----------+--------------------------+--+----------------+---------+----------------------+----------+--------------------------+
      

  11.   

    跑了一下SQL
    结果如下+----------+
    | count(*) |
    +----------+
    | 18364876 |
    +----------+
    1 row in set (10 min 41.09 sec)这正常吗?
      

  12.   

    从15楼的结果来看,你已经创建了A表索引,SQL语句没有优化了,考虑分区表之类 explain select * from A,B where A.ID=B.id
    结果如何
      

  13.   

    没什么可优化的了。对于A表,总归是全表扫描,主要的优化是通过A查B的时候。你的B上ID已经有索引了。
      

  14.   

    补充一个重要信息:我的ID是程序自动生成的,类似于下面这样:
    ccf5d652-26eb-4692-a4ae-8ceafd9ca663
    fcd16e39-42c1-460a-a38a-7f18828cc5dd
    af370e48-b974-4c78-b0ac-48aad84747df
    这样会对 A.ID=B.id  的判断产生很大的影响吗?
    比如我简单的把ID搞成字增或者纯数字会不会又能提高不少效率啊,各位亲
      

  15.   

    楼主数据库引擎是用innoDB吧? 它查询count(*) 超级慢!