mysql两张表left join,电脑就卡死。
左表tableLeft:userid,name。
右表tableRight:userid。
左表90000条数据,右表1000条数据。
select tableLeft.userid,tableLeft.name
from tableLeft left join tableRight on tableLeft.userid = tableRight.userid
where tableRight.userid is null
选出来的结果应该是90000-1000=89000条数据。如果tableRight里数据量为0,那么这条sql很快。现在是tableRight有1000条数据,一执行电脑就卡死了。

解决方案 »

  1.   

    show create table 左表;
    show create table 右表;show index from 左表;
    show index from 右表;explain select tableLeft.userid,tableLeft.name
    from tableLeft left join tableRight on tableLeft.userid = tableRight.userid
    where tableRight.userid is null;贴出以上信息以便分析。 
      

  2.   

    狼兄貌似常驻mysql区嘛!每次都坐沙发。我对mysql不熟悉,基本上没怎么用过。前面随便举了两张表作为例子,现在贴出实际中的两张表吧!下面贴出两张表的详细信息:
    //左表:
    CREATE TABLE `mlt_bill` (
      `rest_id` int(6) default NULL,
      `bill_id` int(11) unsigned NOT NULL auto_increment,
      `token` varchar(32) NOT NULL default '',
      `drawer_event` varchar(32) default '忙鈥澛睹┾€溌?,
      `billtime` int(11) default NULL,
      `soup` varchar(32) default NULL,
      `spice` varchar(32) default NULL,
      `grand_total` float default NULL,
      `pay_method` varchar(32) default NULL,
      `cover_by` varchar(32) default NULL,
      `cash_received` float default '0',
      `cash_change` float default '0',
      `cccharge` float default '0',
      `userid` varchar(32) default NULL,
      `guestnumber` varchar(4) default NULL,
      PRIMARY KEY  (`token`),
      UNIQUE KEY `bill_id` (`bill_id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
    mlt_bill 0 PRIMARY 1 token A 82869 BTREE
    mlt_bill 0 bill_id 1 bill_id A 82869 BTREE//右表:
    CREATE TABLE `mlt_bill_feedback` (
      `bill_id` int(11) unsigned default NULL,
      `status` int(2) unsigned default NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;左表是别人的表,右表是我自己新建的表。右表我可以随意修改,但是左表不能做任何改动。
      

  3.   

    //右表:
    缺乏bill_id索引,另外字符集与左表也不一致。
      

  4.   

    mysql数据库是从别人那里直接拿过来的 里面本身就已经有了表mlt_bill
    我自己用toad for mysql新建了表mlt_bill_feedback。
    字符集什么都是默认的。
    mysql有时候真的很麻烦,还存在这些事情。
      

  5.   

    我给mlt_bill_feedback的bill_id见了索引
    眨眼的速度就好了
    有没有索引 差别太大了
      

  6.   

    到底是先用子查询,然后从结果中查询,还是直接left join 呢