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 字段是 usersubscription_user 表的主键。 【参考方案1】:

当你有一个 SQL 查询时,只有索引中的第一列是查询的一部分,索引才能真正帮助你。

您的查询连接su.uid = u.uid,优化器将无法使用它来引用订阅主键索引中的第一列。

您应该颠倒主键中列的顺序,或者,您应该添加一个外键索引,或者在uid上添加一个独立索引

【讨论】:

以上是关于select mysql 查询的性能真的很差的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView 的实际性能真的很差

使用范围标准对连接表进行 MySQL 优化

Mysql 子查询

MySQL性能测试之select&updateFunTester框架#yyds干货盘点#

EasyClick 之 MySQL 子查询

EasyClick 之 MySQL 子查询