当OR在哪里时加速MySQL ORDER-BY

时间:2017-11-06 21:42:20

标签: mysql

我有一个包含200万行的表,一个“通道”列和一个“时间”列。

我有关于频道和时间的单独索引,以及关于频道+时间的综合索引。

这是瞬间的:

$fileObject = json_decode($app->request->getBody());
$data = implode(array_map('chr', $fileObject->fileBytes));
file_put_contents('/tmp/' . $fileObject->filename, $data);

但这需要12-15秒:

select * from table where channel = 5 order by time desc limit 10

解释说组合索引用于两者,但区别在于在第二个上调用filesort(我假设在两个选择之间进行合并排序)

有没有一种很好的方法来加快速度,或者我应该做两次选择并稍后合并结果? (因为几乎所有东西都可以合并 - 这些天在不到15秒的时间内排序10件物品)

1 个答案:

答案 0 :(得分:0)

关系数据库,尤其是mysql,因缺乏对{em> {/ 1>}的两个方面的索引访问而缺乏优化而臭名昭着。

在这种情况下,您可以使用OR提供使用索引的单个表达式:

IN (...)

即使逻辑上它返回完全相同的数据,mysql也会在编码为select * from table where channel in (4, 5) order by time desc limit 10 时使用这两个值的索引,但如果编码为{{}则会赢得&#t; 1}}。