select mysql 查询的性能真的很差
Posted
技术标签:
【中文标题】select mysql 查询的性能真的很差【英文标题】:Perf of select mysql query is really bad 【发布时间】:2014-11-25 17:12:53 【问题描述】:我不确定为什么这个查询需要 4 分钟才能完成:
SELECT
su.sid,u.uid,u.display_name,u.locale
FROM user u
LEFT JOIN subscription_user su ON su.uid = u.uid
ORDER BY u.display_name DESC
LIMIT 0,25;
好吧,我知道这是由于订单,删除它,它非常快。如果我改为使用 INNER JOIN 会很快,但问题不是所有用户都可能在 subscription_user 表中。
CREATE TABLE `user` (
`uid` int(11) NOT NULL AUTO_INCREMENT,
`password` varchar(100) DEFAULT NULL,
`user_type` varchar(10) NOT NULL DEFAULT 'user',
`display_name` varchar(50) NOT NULL,
`email` varchar(100) NOT NULL,
`locale` varchar(8) DEFAULT 'en',
`last_login` datetime DEFAULT NULL,
`auth_type` varchar(10) DEFAULT NULL,
`auth_data` varchar(500) DEFAULT NULL,
`inactive` tinyint(4) NOT NULL DEFAULT '0',
`receive_email` tinyint(4) NOT NULL DEFAULT '1',
`stateid` int(10) DEFAULT NULL,
`owner_group_id` int(11) DEFAULT NULL,
`signature` varchar(500) DEFAULT NULL,
`raw_signature` varchar(500) DEFAULT NULL,
`round_robin` smallint(5) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`uid`),
UNIQUE KEY `email` (`email`),
KEY `stateid` (`stateid`) USING BTREE,
KEY `user_type` (`user_type`) USING BTREE,
KEY `name` (`display_name`)
) ENGINE=InnoDB AUTO_INCREMENT=28343 DEFAULT CHARSET=latin1;
CREATE TABLE `subscription_user` (
`sid` varchar(50) NOT NULL,
`uid` int(11) NOT NULL,
`deleted` tinyint(4) NOT NULL DEFAULT '0',
`forum_user` varchar(50) NOT NULL,
PRIMARY KEY (`sid`,`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
【问题讨论】:
我猜问题是表 'subscription_user' 上缺少键 'uid' 它是subscription_user
主键的一部分
所以?您的加入已开启 su.uid = u.uid
你试过给display_name
添加索引吗?
猜猜我不确定你的意思。 uid
字段是 user
和 subscription_user
表的主键。
【参考方案1】:
当你有一个 SQL 查询时,只有索引中的第一列是查询的一部分,索引才能真正帮助你。
您的查询连接su.uid = u.uid
,优化器将无法使用它来引用订阅主键索引中的第一列。
您应该颠倒主键中列的顺序,或者,您应该添加一个外键索引,或者在uid
上添加一个独立索引
【讨论】:
以上是关于select mysql 查询的性能真的很差的主要内容,如果未能解决你的问题,请参考以下文章