2017-12-21 10 views
-2
SELECT *, SUM(real_premier_num) AS real_premier_num, SUM(premier_num) AS premier_num, 
GROUP_CONCAT(tg_time SEPARATOR '-') AS post_time, GROUP_CONCAT(low_price SEPARATOR '-') 
AS low_price FROM `port_wbinfo` WHERE `city_id` = 12 AND `is_tg` = 0 GROUP BY 
`hz_post_id` ORDER BY `off_time` DESC, `shelf_time` DESC, `id` DESC LIMIT 10 

私は以下のようなインデックスを作成しましたが、動作しません。グループ化する必要があります。意味をなさないGROUP BY私は以下のSQLを持って、私は最適化する方法を知らない?

SELECT hz_post_id, SUM(real_premier_num) AS real_premier_num, 
     SUM(premier_num) AS premier_num, 
     GROUP_CONCAT(tg_time SEPARATOR '-') AS post_time, 
     GROUP_CONCAT(low_price SEPARATOR '-') AS low_price 
FROM port_info pi 
WHERE city_id = 12 
GROUP BY hz_post_id 
ORDER BY MAX(id) DESC; 

SELECT *

alter table port_wbinfo add index `city_tg` (`city_id`,`is_tg`); 
+0

Wyはあなたが 'GROUP BY'で' SELECT * 'を使っていますか?それは単に正しくありません。 –

+0

クエリが技術的に無効です。なぜなら、あなたは 'GROUP BY'(おそらく下位票のソース)で' SELECT * 'を実行しているからです。つまり、インデックスがすべてのレコードにタッチする必要がある 'SUM'を使用しているので、' GROUP BY'演算に役立つかどうかはわかりません。しかし、WHERE句とORDER BY句に含まれるカラムにインデックスを追加することができます。 –

+0

_「動作しません」_は問題の説明ではありません。何故なの?そして、なぜ最適化が心配ですか?あなたはそれが潜在的に遂行していることを証明しましたか?それはどのくらいかかりますか?そしてそれはどれくらい遅いですか? –

答えて

2

あなたは、としてクエリを記述する必要があります。他のほぼすべてのデータベースと同様に、MySQLの最新バージョンはエラーを出します(デフォルト設定)。

このクエリでは、port_info(city_id, hz_post_id)のインデックスを使用できます。必要に応じて、real_premier_num, premier_num, tg_time, low_price, idをインデックスに追加してクエリをカバーすることができます。

これは大きな改善をもたらさないかもしれませんが、カバーインデックスが役立つかもしれません。

関連する問題