› MySQL 5.5 Community Server
› MySQL 5.6 Community Server
› Percona Configuration Wizard
› XtraBackup 搭建主从复制
Great Sites on MySQL
› Percona
› MySQL Performance Blog
› Severalnines
推荐管理工具
› Sequel Pro
› phpMyAdmin
推荐书目
› MySQL Cookbook
MySQL 相关项目
› MariaDB
› Drizzle
参考文档
› http://mysql-python.sourceforge.net/MySQLdb.html
kchum
V2EX  ›  MySQL

Mysql语句优化有一点疑问~~

  •  
  •   kchum · Oct 25, 2012 · 4007 views
    This topic created in 5092 days ago, the information mentioned may be changed or developed.
    语句如下
    SELECT COUNT(DISTINCT `t`.`id`) FROM `vt_crm`.`customerusers` `t`
    LEFT OUTER JOIN `vt_crm`.`customer` `sales`
    ON (`t`.`customerid`=`sales`.`id`)
    LEFT OUTER JOIN `vt_base`.`cate` `cate`
    ON (sales.cateid = cate.id)
    LEFT OUTER JOIN `vt_base`.`city` `city`
    ON (city.id = sales.cityid)
    WHERE ((gradeid='5') AND (sales.enable='1'))

    count是查总数,做分页的(customerusers 表 230w数据,customer表50W数据,gradeid是6个值,enable是可用)~

    查出来要2秒多。就算去掉后面的cate跟city也要将近2秒

    查资料时也试过用SQL_CALC_FOUND_ROWS,FOUND_ROWS比用count还慢~

    请问下大家该如何优化这条语句
    或者有没有其他方案去查符合条件的总数~
    7 replies  •  1970-01-01 08:00:00 +08:00
    explon
        1
    explon  
       Oct 25, 2012
    你索引没做好吧
    kchum
        2
    kchum  
    OP
       Oct 25, 2012
    @explon 联合索引没做,gradeid就6个值。作用不大吧~
    explon
        3
    explon  
       Oct 25, 2012
    @kchum 作用很大
    kchum
        4
    kchum  
    OP
       Oct 25, 2012
    @explon
    SELECT COUNT(DISTINCT `t`.`id`) FROM `vt_crm`.`customerusers` `t`
    LEFT OUTER JOIN `vt_crm`.`customer` `sales`
    ON (`t`.`customerid`=`sales`.`id`)
    WHERE ((gradeid='5') AND (sales.enable='1'))

    t表家里customer的id跟gradeid加了联合索引
    sales的id跟enable也加了联合索引,现在1.6秒了~
    napoleonu
        5
    napoleonu  
       Nov 1, 2012
    LZ貌似没理解 LEFT OUTER JOIN ,你这条语句和

    SELECT COUNT(DISTINCT `t`.`id`) FROM `vt_crm`.`customerusers` `t` WHERE (gradeid='5') ;

    没分别。
    ElmerZhang
        6
    ElmerZhang  
       Nov 2, 2012
    customerusers 的 id 不是主键?如果是的话没必要加 distinct
    gradeid 是哪个表的字段?
    下面这四行貌似都没用,可以去掉
    LEFT OUTER JOIN `vt_base`.`cate` `cate`
    ON (sales.cateid = cate.id)
    LEFT OUTER JOIN `vt_base`.`city` `city`
    ON (city.id = sales.cityid)
    kchum
        7
    kchum  
    OP
       Nov 2, 2012
    @ElmerZhang gradeid 是customerusers的字段,id是主键。好像倒也是啊。

    @napoleonu 现在想想,还真是没区别~这条语句是同事写的,我都蒙了~~
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2162 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 00:39 · PVG 08:39 · LAX 17:39 · JFK 20:39
    ♥ Do have faith in what you're doing.