2017-11-28 18 views
1

私はさまざまなイベントの詳細と、それらのイベントでブックメーカーが提供しているすべてのオッズを保持するデータベースを持っています。MySQLクエリのパフォーマンスを向上させる方法

SELECT 
    eo1.id, 
    eo1.event_id, 
    eo1.market_id, 
    IF(markets.display_name IS NULL, markets.name, markets.display_name) AS market_name, 
    IF(market_values.display_name IS NULL, market_values.name, market_values.display_name) AS market_value_name, 
    eo2.bookmaker_id, 
    eo2.value 
FROM event_odds AS eo1 
JOIN markets ON eo1.market_id = markets.id AND markets.enabled = 1 
JOIN market_values on eo1.market_value_id = market_values.id 
JOIN bookmakers on eo1.bookmaker_id = bookmakers.id AND bookmakers.enabled = 1 
JOIN event_odds AS eo2 
ON 
    eo1.event_id = eo2.event_id 
    AND eo1.market_id = eo2.market_id 
    AND eo1.market_value_id = eo2.market_value_id 
    AND eo2.value = (
     SELECT MAX(value) 
     FROM event_odds 
     WHERE event_odds.event_id = eo1.event_id 
     AND event_odds.market_id = eo1.market_id 
     AND event_odds.market_value_id = eo1.market_value_id 
    ) 
WHERE eo1.`event_id` = 6708 
AND markets.name != '-' 
GROUP BY eo1.market_id, eo1.market_value_id 
ORDER BY markets.sort_order, market_name, market_values.id 

これは私がデータベースのサイズが成長してきたので、非常にあることを始めていますが欲しいものを正確に返します。私は、私は各イベントの賭けのそれぞれ異なるタイプのための最高のオッズを取得するために使用しています次のクエリを持っていますスロー。私は現在、イベント・オッズ・テーブルに500,000を超えるレコードがあり、クエリの実行には約2分かかります。ハードウェアはまともな仕様で、すべての列が正しく索引付けされ、使用される表エンジンはすべての表のMyISAMです。このクエリを最適化してより速く実行するにはどうすればよいですか?

+0

質問の最適化に関する質問には、show create table [table]文とexplain [query]が含まれている必要があります。 –

答えて

3

このクエリでは、インデックスがevent_odds(event_id, market_id, market_value_id, value)であることを確認する必要があります。

また、あなたは上のインデックスたい:

  • 市場
  • ブックメーカー(ID、有効)複合インデックスは、複数の全く異なっていることを

注意を(idは、名前を有効)それぞれ1つの列を持つ索引。

+0

あああなたは正しいです!私は列を個別に索引付けしていましたが、現在は2秒で実行されています。 – geoffs3310

0

このSQLのMySQLビューを作成します。そのMySQLビューからデータを取得してみてください。これは速度を上げるのに役立ち、複雑さを軽減することができます。リミットを使用したリスティングのページネーションを試してください。これにより、サーバーの負荷も軽減されます。典型的な列のインデックスを作成する

関連する問題