首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何提高MySQL查询的性能

如何提高MySQL查询的性能
EN

Stack Overflow用户
提问于 2017-11-28 11:51:09
回答 2查看 36关注 0票数 1

我有一个数据库,其中包含了各种不同事件的细节,以及博彩公司在这些活动上提供的所有可能性。我有以下查询,用于为每个事件获得每种不同类型的赌注的最佳概率:

代码语言:javascript
运行
复制
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。如何优化这个查询,使其运行得更快?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-28 11:57:42

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

此外,还需要对以下内容进行索引:

  • 市场(id,启用,名称)
  • 庄家(id,已启用)

注意,复合索引与多个索引非常不同,每个索引都有一列。

票数 3
EN

Stack Overflow用户

发布于 2017-11-28 11:56:45

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47530898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档