mysql - 如何提高 MySQL 查询的性能

标签 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。我如何优化此查询以使其运行得更快?

最佳答案

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

此外,您需要索引:

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

请注意,复合索引与每个只有一列的多个索引有很大不同。

关于mysql - 如何提高 MySQL 查询的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47530898/

相关文章:

php - 在 jQuery 中使用 AJAX 访问信息并将数据从 PHP 传递到 JSON

python - Django 模型计数器

java - 将此函数重写为数据库查询?

sql - 查找所有重复的组,其中重复意味着包含相同成员的组

javascript - 如何将js鼠标坐标获取到php插入查询中?

php - 非主键自增字段

php - http/1.1 406 在通过 json 发送数据的 android 应用程序上 Not Acceptable

SQL 在某个日期后获取每个 ID 的最后一条记录

sql - 是否有可能在同一触发器运行中混合更新和插入?

sql - 多个表的 CHECKSUM_AGG