2015年1月13日星期二

Mysql多个LEFT JOIN使用ORDER不能使用索引解决方案

Mysql在多个LEFT JOIN的情况下使用ORDER BY排序,就算是其中一个表的主键也仍然使用file sort排序,数据量多的话就相当的慢。

优化前语句
SELECT * FROM a LEFT JOIN b ON a.id=b.a_id ORDER a.id DESC

优化后语句
SELECT * FROM a LEFT JOIN b ON a.id=b.a_id JOIN (SELECT id FROM a ORDER BY id DESC) a_order ON a.id = a_order.id

实际工作中100W+的几个表使用LEFT JOIN要20分钟才能得到结果,语句优化后3秒。

以下是实际操作中Durpal Views的 hook_views_query_alter() 使用代码

    $views_join = new views_join();
    $views_join->extra_type = 'AND';
    $views_join->table = '(SELECT aid FROM activity_log ORDER BY aid DESC)';
    $views_join->left_table = 'activity_log';
    $views_join->left_field = 'aid';
    $views_join->field = 'aid';
    $views_join->type = 'INNER';
    $views_join->adjusted = true;
    $query->table_queue['activity_log_order']['join'] = $views_join;
    $query->table_queue['activity_log_order']['alias'] = 'activity_log_order';?>

上海松善实业有限公司

    上海松善实业有限公司是一家集多品牌销售于一体的电线电缆骨干企业,公司成立于2016年。 公司拥有国内各大品牌:起帆、远东、上上、江南、胜华等。     主要产品有:高低压电力电缆、橡套电缆、控制电缆、架空绝缘电缆、塑胶电缆、电子计算机电缆、通讯电缆、...