MySQL:有索引和小文件排序还是没有索引和没有文件排序更好?

Posted

技术标签:

【中文标题】MySQL:有索引和小文件排序还是没有索引和没有文件排序更好?【英文标题】:MySQL: Is it better to have an index and a small filesort or no index and no filesort? 【发布时间】:2010-09-22 15:11:43 【问题描述】:

我有一个包含位置数据的大型数据库(超过 180k 行并且增长迅速),并且正在将它们绘制在谷歌地图上。对于给定的视口,我只想提供 100 个适用点的样本。因此,数据库由 lat/lng 查询,但如果我在这些行上放置索引,问题是 100 个点的样本将位于视口的底部或顶部(取决于索引的使用方式) .如果不使用索引,则这些点几乎是随机散布在视口中的,这是更可取的。我可以通过对第三个几乎随机的字段进行文件排序来对索引结果创建相同的效果。

所以,问题似乎是,哪个更好:对 180k+ 行的未索引查询,或将查看类似 4k 行的索引查询并进行文件排序?谢谢!

【问题讨论】:

首先:确保您正确理解“文件排序”术语:mysqlperformanceblog.com/2009/03/05/… 没有任何迹象表明他没有? ORDER BY RAND() 总是使用文件排序,不是吗? 【参考方案1】:

您会发现许多反对使用“ORDER BY RAND()”的论据,但如果您 为该字段编制索引并且您发现分析结果是可以接受的,那么在这种情况下它可能会很有用:

mysql> select id from table where id > 10000 and id < 20000 order by rand() limit 0,10;
+-------+
| id    |
+-------+
| 18560 | 
| 18408 | 
| 14058 | 
| 19090 | 
| 11100 | 
| 18945 | 
| 12656 | 
| 16549 | 
| 19321 | 
| 12003 | 
+-------+
10 rows in set (0.04 sec)

【讨论】:

我当前的 order by 子句只是伪随机的,但非常适合我的需要。实际上随机排序可能只是额外的压力,没有任何目的 如果您从性能角度询问哪种方法更好,您应该在控制台中使用 MySQL 的分析命令对这两种方法进行基准测试。【参考方案2】:

使用索引和不使用索引来分析您的查询。我在 dbForge Studio for MySQL 中使用分析器。

【讨论】:

以上是关于MySQL:有索引和小文件排序还是没有索引和没有文件排序更好?的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL中MyISAM 和InnoDB索引的区别

在 MySQL 查询中使用 OR 时,有没有办法使用索引来避免文件排序?

mysql 中 创建索引很慢,怎么解决

myisam和innodb的区别

Mysql之索引

是否可以索引 mysql 表以按 A 减去 B 排序?