Mysql数据库某个表连接查询很慢,如何优化?

两个表连接查询很慢,但是如果单查一个表则很快,或者连接查询其他的表也很快。

查询语句大约半秒的查询时间:

SELECT * FROM member m LEFT JOIN gift g ON g.mid = m.id WHERE m.status = 0 AND m.wid = 236 ORDER BY m.id DESC LIMIT 0,20

member表结构约40000条数据:

CREATE TABLE `member` `id` int11 NOT NULL AUTO_INCREMENT, `wid` int11 NOT NULL, `wxid` varchar30 DEFAULT NULL, `wid_wxid` varchar30 DEFAULT NULL, `cpai` varchar32 NOT NULL, `name` varchar20 DEFAULT NULL, `sex` varchar10 DEFAULT NULL, `tel` varchar11 DEFAULT NULL, `lxtel` varchar11 DEFAULT NULL, `xingge` varchar10 DEFAULT NULL, `qq` int11 DEFAULT NULL, `birthday` varchar12 DEFAULT NULL, `cartype` varchar20 DEFAULT NULL, `carclass` varchar20 DEFAULT NULL, `bxtime` varchar20 DEFAULT 0.00, `next_bxtime` varchar20 DEFAULT 0.00, `bytime` varchar20 DEFAULT 0.00, `next_bytime` varchar20 DEFAULT 0.00, `bylong` varchar20 DEFAULT 0.00, `next_bylong` varchar20 DEFAULT 0.00, `engine` varchar50 DEFAULT NULL, `chejia` varchar50 DEFAULT NULL, `danganhao` varchar30 DEFAULT NULL, `buy_date` varchar20 DEFAULT NULL, `first_date` varchar20 DEFAULT NULL, `weixiu_times` tinyint4 DEFAULT NULL, `weixiu_money` decimal8,2 DEFAULT NULL, `last_date` varchar20 DEFAULT NULL, `last_jieche` varchar50 DEFAULT NULL, `cpai_register` varchar20 DEFAULT NULL, `identify_number` varchar20 DEFAULT NULL, `order_number` varchar20 DEFAULT NULL, `sale_date` varchar20 DEFAULT NULL, `carkilometre` int11 DEFAULT 0, `address` varchar32 DEFAULT NULL, `remark` varchar32 DEFAULT NULL, `is_check` int11 DEFAULT 0, `password` char6 DEFAULT NULL, `salt` char32 DEFAULT NULL, `pay_password` char32 DEFAULT NULL, `pay_salt` char6 DEFAULT NULL, `status` tinyint4 DEFAULT 0, `time` varchar24 NOT NULL, `headimgurl` varchar200 DEFAULT NULL, `nickname` varchar32 DEFAULT NULL, `isattention` tinyint4 DEFAULT 0, `paid_price` decimal8,2 DEFAULT 0.00, `source` int11 DEFAULT NULL, `add_date` datetime DEFAULT NULL, `add_by` varchar30 DEFAULT , `update_date` datetime DEFAULT NULL, `update_by` varchar30 DEFAULT , PRIMARY KEY `id` ENGINE=MyISAM AUTO_INCREMENT=59151 DEFAULT CHARSET=utf8;

gift表结构约4000条数据:

CREATE TABLE `member_giftamount` `id` int16 NOT NULL AUTO_INCREMENT, `wid` int32 NOT NULL, `mid` int11 NOT NULL, `auth_wid` int11 DEFAULT NULL, `wxid` varchar64 DEFAULT NULL, `tel` varchar30 DEFAULT NULL, `amount` decimal8,2 DEFAULT 0.00, `gift_amount` decimal8,2 DEFAULT 0.00, `refund_amount` decimal8,2 DEFAULT 0.00, `credits` int11 DEFAULT 0, `total` decimal8,2 DEFAULT 0.00, `market_total` decimal8,2 DEFAULT 0.00, `wid_wxid` varchar64 DEFAULT NULL, `wait_total` decimal8,2 DEFAULT 0.00, `add_date` datetime DEFAULT NULL, `add_by` varchar30 DEFAULT NULL, `update_date` datetime DEFAULT NULL, `update_by` varchar30 DEFAULT NULL, `sign_days` int11 NOT NULL DEFAULT 0, PRIMARY KEY `id` ENGINE=MyISAM AUTO_INCREMENT=4254 DEFAULT CHARSET=utf8; 

索引优化:g表mid加索引;m表status和wid加索引;慢查询看一下是否用到了索引,尽量让rows数小点

  1. 建立索引

    1. 将member表中的id,wid,wxid,wid_wxid建立索引

    2. 将gift表中的id,wid,mid,auth_wid,wxid建立索引

    3. 如果你where条件中经常出现一些字段,也要建立索引。

  2. 不要用*号:只列出需要的字段

  3. SQL参考:sql是我直接写的,没测试

select 不要用* from SELECT m.status,m.wid,m.id FROM member m WHERE m.status = 0 AND m.wid = 236 a
LEFT JOIN gift g ON g.mid = a.id ORDER BY a.id DESC LIMIT 0,20

给gift的mid字段建个外键,关联member表的id

参考下有没有价值,我不懂数据的事!
http://www.zhihu.com/question/37777220

麻烦把执行计划贴出来

建立索引,使用子查询。

发表评论

电子邮件地址不会被公开。 必填项已用*标注