本帖最后由 lxq73061 于 2013-12-01 04:08:00 编辑

解决方案 »

  1.   

    将AND baojia_list.id IN(*)条件删除后:
    SELECT sp_color.id, sp_color.color, baojia_list.price, baojia_list.mydate
    FROM sp_color, baojia_list
    WHERE sp_color.id = baojia_list.color_id
    AND sp_color.sp_id =7534;#Empty set (3.13 sec)EXPLAIN 结果:
    id  select_type  table  type  possible_keys  key  key_len  ref  rows  Extra
    1  SIMPLE  baojia_list  ALL  NULL NULL NULL NULL 589111 
    1  SIMPLE  sp_color  eq_ref  PRIMARY  PRIMARY  4  b2b2.baojia_list.color_id  1  Using where
      

  2.   

    我将SQL换成下面这样:SELECT max(baojia_list.id),sp_color.id,sp_color.color,baojia_list.price,baojia_list.mydate 
    FROM sp_color,baojia_list 
    WHERE 
    sp_color.id=baojia_list.color_id 
    AND sp_color.sp_id=7534 GROUP BY color_id#结果是3.46秒问题是同一个查询,为什么MSSQL也没有建立索引,速度却在0.1秒左右。
      

  3.   

    数据库优化处理的算法不同。 毕竟MYSQL是免费的。如果MYSQL在任何方面都强过SQL SERVER或者ORACLE的话,那全世界应该只有MYSQL了。
    每种数据库都有它自己的优点缺点。
      

  4.   

    在mysql中,外键是要加索引的,否则连接很慢。(其他大部分数据库也是)
    MSSQL之所以没有索引,也那么快,是它的独特之处,这种独特之处是要有其他开销(比如存储)作为补偿。所以不要太纠结这个问题。加索引就是了。
      

  5.   

    不要纠结了,既然都知道没有索引,把索引加上就行了.
    MSSQL快,你可以再深入一下,看看它是不是内部为它创建索引了.没有索引,只是表扫描,不可能那么快.
      

  6.   

    如何看MSSQL内部为它创建索引,由于对MSSQL接触的不太多,所以不是很清楚,很感谢你们的回答。
      

  7.   

    mysql 中 show index from ...
      

  8.   

    MYSQL的索引查看方式知道,
    MSSQL呢,我用管理器确实没有看到其他索引。
      

  9.   

    每个DBMS都有自己的优化方式,见过从mysql移到sqlserver超慢的例子,后来让他更新统计信息(mysql不知道是对应哪个),重建索引,性能就恢复正常了
      

  10.   

    我看来你去mysql问问mysql是如何进行查询优化的才有意义
      

  11.   

    之前看了一本叫 sql重构的书,里面比较了oracle、sql server、mysql3个数据库的性能差异。重点提到的就是,当语句的写法不同时,或者比较复杂时,往往mysql得不到比较优化的执行计划,导致性能的差异巨大,这个主要是优化器的问题导致的,mysql的优化器肯定和商业数据库,有较大的差距,所以一般的mysql应用,都是非常简答的sql语句,如:select xxx from 表。所以我觉得,你得把语句,进行简化,考虑 把你的语句拆分,简化,然后把每个语句的结果先存到临时表,然后最后再关联这些临时表的结果。
      

  12.   

    还有就是,尝试一下重建索引,把这个慢的语句,设计到的表的索引,都重建一下:REPAIR TABLE tbl_name QUICK;
      

  13.   

    MySQL里的子查询效率极低,不要在MySQL里用子查询,尤其是OLTP系统。
      

  14.   

    SELECT baojia_list.id,sp_color.color, baojia_list.price
    FROM sp_color, baojia_list
    WHERE sp_color.sp_id =462
    AND price >0
    AND baojia_list.color_id = sp_color.id
    AND baojia_list.id
    IN (
    SELECT MAX( id ) 
    FROM baojia_list
    GROUP BY color_id
    );
    这个SQL也是,查询起来几十秒,如果把那个in()的子查询去掉后,1秒就能查出来。
    问题是我想得到不同的color_id在 baojia_list最大(最新的报价)那条。
    可以通过修改SQL实现吗?
      

  15.   

    mysql> EXPLAIN SELECT baojia_list.id, sp_color.color, baojia_list.price
        -> FROM sp_color, baojia_list
        -> WHERE sp_color.sp_id =462
        -> AND price >0
        -> AND baojia_list.color_id = sp_color.id
        -> AND baojia_list.id
        -> IN (
        ->
        -> SELECT MAX( id )
        -> FROM baojia_list
        -> GROUP BY color_id
        -> );
    +----+--------------------+-------------+--------+---------------+----------+---------+---------------------------+--------+-------------+
    | id | select_type        | table       | type   | possible_keys | key      | key_len | ref                       | rows   | Extra       |
    +----+--------------------+-------------+--------+---------------+----------+---------+---------------------------+--------+-------------+
    |  1 | PRIMARY            | baojia_list | ALL    | color_id      | NULL     | NULL    | NULL                      | 575085 | Using where |
    |  1 | PRIMARY            | sp_color    | eq_ref | PRIMARY       | PRIMARY  | 4       | b2b2.baojia_list.color_id |      1 | Using where |
    |  2 | DEPENDENT SUBQUERY | baojia_list | index  | NULL          | color_id | 5       | NULL                      |     83 | Using index |
    +----+--------------------+-------------+--------+---------------+----------+---------+---------------------------+--------+-------------+
    mysql> EXPLAIN SELECT baojia_list.id, sp_color.color, baojia_list.price
        -> FROM sp_color, baojia_list
        -> WHERE sp_color.sp_id =462
        -> AND price >0
        -> AND baojia_list.color_id = sp_color.id;
    +----+-------------+-------------+--------+---------------+---------+---------+---------------------------+--------+-------------+
    | id | select_type | table       | type   | possible_keys | key     | key_len | ref                       | rows   | Extra       |
    +----+-------------+-------------+--------+---------------+---------+---------+---------------------------+--------+-------------+
    |  1 | SIMPLE      | baojia_list | ALL    | color_id      | NULL    | NULL    | NULL                      | 575085 | Using where |
    |  1 | SIMPLE      | sp_color    | eq_ref | PRIMARY       | PRIMARY | 4       | b2b2.baojia_list.color_id |      1 | Using where |
    +----+-------------+-------------+--------+---------------+---------+---------+---------------------------+--------+-------------+
    2 rows in set (0.00 sec)
      

  16.   

    不要纠结于使用哪种数据库这不重要,重要的是你掌握数据中处理方法这是很关键。
    在sql server运行速度是可以的 ,到mysql运行速度慢了下来,是否在mysql
    数据中是否有是否使用索引,如没有使用索引添加索引就可以了。另外服务器的参数
    是否调整、硬件环境这都是影响的因素要综合考虑才是的。
      

  17.   

    服务器是一台开发时用的普通PC,两个数据库都安装在上面。
    现在的问题可能是:MSSQL转到MSYSQL后,SQL语句要注意哪些问题?
    为了实现18楼那个查询结果,将sql改成如下后,查询时间在1秒多一点。
    SELECT color,mid( prices,1,locate(',',prices)-1) from (
    SELECT c.color, GROUP_CONCAT(b.price ORDER BY b.id DESC) AS prices
    FROM sp_color c, baojia_list b
    WHERE c.sp_id = 462
      AND c.id = b.color_id
    GROUP BY c.id) as ss;