如何提高MySQL查询的性能

时间:2017-11-28 11:51:09

标签: mysql sql

我有一个数据库,其中包含各种不同事件的详细信息以及博彩公司为这些事件提供的所有赔率。我有以下查询,我用它来为每个事件的每种不同类型的赌注获得最佳赔率:

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。如何优化此查询以便更快地运行?

2 个答案:

答案 0 :(得分:3)

对于此查询,您希望确保在event_odds(event_id, market_id, market_value_id, value)上有索引。

此外,您还需要索引:

  • 市场(id,enabled,name)
  • 博彩公司(id,已启用)

请注意,复合索引与多个索引完全不同,每个索引都有一列。

答案 1 :(得分:0)

为此SQL创建MySQL视图。然后尝试从MySQL视图中获取数据。这有助于提高速度并降低复杂性。尝试使用限制进行列表分页。这也将减少服务器上的负载。尝试为典型列索引