Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何提高MySQL查询的性能_Mysql_Sql - Fatal编程技术网

如何提高MySQL查询的性能

如何提高MySQL查询的性能,mysql,sql,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_value

我有一个数据库,里面有各种不同事件的详细信息,以及收受赌注者在这些事件上提供的所有赔率。我有以下查询,我正在使用它为每个事件的每种不同类型的赌注获得最佳赔率:

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

这正好返回了我想要的结果,但是由于数据库的大小已经增加,它开始变得非常缓慢。我目前在事件赔率表中有超过500000条记录,查询运行几乎需要2分钟。硬件是体面的规范,所有列都被正确索引,所有表使用的表引擎都是MyISAM。如何优化此查询以使其运行更快?

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

对于此查询,您希望确保您有一个关于
事件概率(事件id、市场id、市场价值id、价值)的索引

此外,您还需要索引:

  • 市场(id、已启用、名称)
  • 收受赌注者(id,已启用)

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

关于查询优化的问题应该包括show create table[table]语句和explain[query]Ah您是对的!我只对各个列进行了索引,现在它只需2秒钟就可以运行了!