以前数据量少的情况下,页面查询很快。现在有几万笔数据了,查询相应的数据很慢,要几十秒才能把数据结果在页面上显示。索引我也加过了,还是没有用。怀疑是sql语句的问题,在数据库里直接查询的结果:显示行 0 - 0 (1 总计, 查询花费 1.6105 秒),请问有无方法优化?请高手支招,谢谢!select * from `barcode_all` where `packageno`= 'CVT120207037'or`packageno`= ''or`packageno`= ''or`packageno`= ''or`packageno`= ''or`packageno`= ''or`packageno`= ''or`packageno`= ''or`packageno`= ''or`packageno`= ''or`packageno`= ''or`packageno`= ''or`packageno`= ''or`packageno`= ''or`packageno`= ''or`packageno`= ''or`packageno`= ''or`packageno`= ''or`packageno`= ''or`packageno`= '' group by packageno 

解决方案 »

  1.   

    packageno=''很多空值,mysql语句有问题吧
      

  2.   

    贴出你的 explain select ...
    show index from barcode_all
    的结果以供分析。虽然可以改为 in (... 但仅是视觉上好看,效率不会提高。
      

  3.   

    忘了说了,'barcode_all'这张表是视图。我刚才试了单独查询也很慢。是不是问题出在这里?是否要加上索引?
      

  4.   

    barcode_all视图的原生语句:create view barcode_all as select * from `barcode_2d_temp` UNION ALL select * from `barcode_2d` UNION ALL select * from `barcode_2d_n` UNION ALL select ID,username,packageno,lotno,description,type,barcode,date from `barcode_2d_sep` UNION ALL select * from `barcode_2d_sep_temp`
      

  5.   

    结果:id  select_type  table  type  possible_keys  key  key_len  ref  rows  Extra
    1  PRIMARY  <derived2>  ALL  NULL  NULL  NULL  NULL  41712  Using where; Using temporary; Using filesort
    2  DERIVED  barcode_2d_temp  ALL  NULL  NULL  NULL  NULL  1   
    3  UNION  barcode_2d  ALL  NULL  NULL  NULL  NULL  41426   
    4  UNION  barcode_2d_n  ALL  NULL  NULL  NULL  NULL  417   
    5  UNION  barcode_2d_sep  ALL  NULL  NULL  NULL  NULL  80   
    6  UNION  barcode_2d_sep_temp  ALL  NULL  NULL  NULL  NULL  1   
    NULL  UNION RESULT  <union2,3,4,5,6>  ALL  NULL  NULL  NULL  NULL  NULL   
      

  6.   

    难道说我每个union的字段都要建立索引?
      

  7.   

    查询结果:mysql> explain select id from hapsu.barcode_all;
    +----+--------------+---------------------+------+---------------+------+-------
    --+------+-------+-------+
    | id | select_type  | table               | type | possible_keys | key  | key_le
    n | ref  | rows  | Extra |
    +----+--------------+---------------------+------+---------------+------+-------
    --+------+-------+-------+
    |  1 | PRIMARY      | <derived2>          | ALL  | NULL          | NULL | NULL
      | NULL | 41712 |       |
    |  2 | DERIVED      | barcode_2d_temp     | ALL  | NULL          | NULL | NULL
      | NULL |     1 |       |
    |  3 | UNION        | barcode_2d          | ALL  | NULL          | NULL | NULL
      | NULL | 41426 |       |
    |  4 | UNION        | barcode_2d_n        | ALL  | NULL          | NULL | NULL
      | NULL |   417 |       |
    |  5 | UNION        | barcode_2d_sep      | ALL  | NULL          | NULL | NULL
      | NULL |    80 |       |
    |  6 | UNION        | barcode_2d_sep_temp | ALL  | NULL          | NULL | NULL
      | NULL |     1 |       |
    | NULL | UNION RESULT | <union2,3,4,5,6>    | ALL  | NULL          | NULL | NULL
        | NULL |  NULL |       |
    +----+--------------+---------------------+------+---------------+------+-------
    --+------+-------+-------+
    7 rows in set (4.78 sec)请问怎么视图怎么带索引?
      

  8.   

    检查这些表上
     `barcode_2d_temp` 
     `barcode_2d` 
     `barcode_2d_n` 
     `barcode_2d_sep`
     `barcode_2d_sep_temp`是否有索引packageno
      

  9.   


    有索引,谢谢斑竹!我已经用临时表搞定。不过请问mysql临时表的临时文件存在哪个路径下?windows系统。
      

  10.   

    临时表是否会自动删除?当mysql连接结束时。
      

  11.   

    如果是memory引擎的临时表  则放在内存中
    如果是myisam引擎的临时表 放在 show variables like '%tmp%' 目录下