2013-01-19 204 views
0

有此查询已被窃听我两天了,它用来工作不错,但现在它会减慢整个集群环境中,查询,如下图所示:优化的接MySQL查询

SELECT userUploads.*, 
     users_avatar.avatar AS avatar 
FROM userUploads 
     LEFT JOIN users_avatar 
      ON userUploads.udid = users_avatar.udid 
     INNER JOIN user_subscription 
      ON (
        user_subscription.sub_1 = 'G:123456789' 
        AND user_subscription.sub_2 = userUploads.udid 
       ) 
WHERE userUploads.platform = 'Private' 
     AND userUploads.STATUS IN ('featured', 'approved') 
ORDER BY userUploads.id DESC 
LIMIT 50 OFFSET 0 

我真的很感激,如果任何人都可以帮助这个查询。

下面是查询的解释:提前

+----+-------------+-------------------+--------+----------------------+----------+---------+------------------------+------+-----------------------------+ 
| id | select_type | table    | type | possible_keys  | key  | key_len | ref     | rows | Extra      | 
+----+-------------+-------------------+--------+----------------------+----------+---------+------------------------+------+-----------------------------+ 
| 1 | SIMPLE  | userUploads  | range | platform,udid,status | platform | 154  | NULL     | 12 | Using where; Using filesort | 
| 1 | SIMPLE  | users_avatar  | eq_ref | PRIMARY    | PRIMARY | 182  | Seeds.userUploads.udid | 1 |        | 
| 1 | SIMPLE  | user_subscription | ref | sub_1,sub_2   | sub_1 | 93  | const     | 7 | Using where     | 
+----+-------------+-------------------+--------+----------------------+----------+---------+------------------------+------+-----------------------------+ 

感谢

编辑**显示CREATE TABLE可以看到下面

下面是展会创建表的表希望你有任何想法dancrumb。

| users_avatar | CREATE TABLE `users_avatar` (
`udid` varchar(60) COLLATE utf8_unicode_ci NOT NULL DEFAULT '', 
`avatar` varchar(448) COLLATE utf8_unicode_ci DEFAULT NULL, 
PRIMARY KEY (`udid`) 
) ENGINE=ndbcluster DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci | 

| userUploads | CREATE TABLE `userUploads` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`bdaha` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL, 
`user` varchar(60) COLLATE utf8_unicode_ci DEFAULT NULL, 
`direktoren` text COLLATE utf8_unicode_ci, 
`filnamnet` varchar(180) COLLATE utf8_unicode_ci DEFAULT NULL, 
`karhes` varchar(150) COLLATE utf8_unicode_ci DEFAULT NULL, 
`version` char(10) COLLATE utf8_unicode_ci DEFAULT NULL, 
`rostat` int(10) DEFAULT NULL, 
`stars` int(11) DEFAULT NULL, 
`statyn` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL, 
`platform` char(30) COLLATE utf8_unicode_ci DEFAULT NULL, 
`images` int(2) DEFAULT NULL, 
`date` char(10) COLLATE utf8_unicode_ci DEFAULT NULL, 
`udid` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL, 
`favorirepris` int(8) DEFAULT NULL, 
`hikes` char(4) COLLATE utf8_unicode_ci DEFAULT 'no', 
`dbn` char(6) COLLATE utf8_unicode_ci DEFAULT NULL, 
`timestamp` char(20) COLLATE utf8_unicode_ci DEFAULT NULL, 
`comments` int(5) DEFAULT NULL, 
`klistret` enum('no','yes') COLLATE utf8_unicode_ci NOT NULL DEFAULT 'no', 
PRIMARY KEY (`id`), 
KEY `platform` (`platform`,`status`), 
KEY `udid` (`udid`), 
KEY `hikes` (`hikes`), 
KEY `bdaha` (`bdaha`), 
KEY `statyn` (`statyn`), 
KEY `version` (`version`) 
) ENGINE=ndbcluster AUTO_INCREMENT=118831 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci | 


| user_subscription | CREATE TABLE `user_subscription` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
`sub_1` varchar(30) COLLATE utf8_unicode_ci DEFAULT NULL, 
`sub_2` varchar(30) COLLATE utf8_unicode_ci DEFAULT NULL, 
PRIMARY KEY (`id`), 
KEY `sub_1` (`sub_1`), 
KEY `sub_2` (`sub_2`) 
) ENGINE=ndbcluster AUTO_INCREMENT=155184 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci | 
+1

您能为这里涉及的三张桌子提供'SHOW CREATE TABLE'吗? – Dancrumb

+0

我不能回答我自己的问题,因为我是新来的:(如何可以告诉你显示创建表?它是要长时间粘贴在这里... – Gimbo

+0

我在原始帖子中发布了创建表:) – Gimbo

回答

0

那么,你有一个userUploads文件总是缓慢。你可能想玩索引来删除它。例如,您可能希望从udid,平台和状态的索引开始。

+0

Filesort不一定很慢。它只是意味着有一种不能使用索引的排序:** [在MySQL中使用filesort是什么意思?](http://www.mysqlperformanceblog.com/2009/03/05/what-does-using -filesort-mean-in-mysql /)** –

+0

是的,你说得对,我当时马虎。 –

+0

我该如何优化查询?你有任何例子? – Gimbo

0

通常,在查询要按照首先返回的数据执行最大限制操作时,只会对结果中实际存在的数据执行其他操作。

在这种情况下,尝试将内部联接重新排序为user_subscription,将左侧联接重新排列到users_avatar。这样,如果它们实际上位于结果集中,那么它将只尝试为用户获取头像,而不是先查找所有头像,然后基于连接和where子句进行过滤。

SELECT userUploads.*, 
    users_avatar.avatar AS avatar 
FROM userUploads 
INNER JOIN user_subscription 
      ON (
        user_subscription.sub_1 = 'G:123456789' 
        AND user_subscription.sub_2 = userUploads.udid 
       ) 
LEFT JOIN users_avatar 
      ON userUploads.udid = users_avatar.udid 

WHERE userUploads.platform = 'Private' 
     AND userUploads.STATUS IN ('featured', 'approved') 
ORDER BY userUploads.id DESC 
LIMIT 50 OFFSET 0 
+0

该查询将如何显示? – Gimbo

+0

我没有成功 – Gimbo