假设我有players表。它由3行组成(它有更多,但假设它只有3行)。member_id, name, exp。我在每个页面中使用member_id行,这就是为什么我只向member_id添加索引的原因。但是我想在一个页面上用最高的exp做一个顶级球员的列表。所以我做了这样的事情:
$query = mysql_query("SELECT * FROM players ORDER BY `exp` DESC");如果我有10k个播放器,我不能在不向exp添加索引的情况下运行这样的查询。所以我的问题是,我是否应该这样做:
mysql_query("ALTER TABLE `players` ADD INDEX ( `exp` )");
$query = mysql_query("SELECT * FROM players ORDER BY `exp` DESC");
mysql_query("ALTER TABLE `players` DROP INDEX `exp`");或者有其他更好的我可以做的?因为添加和删除索引的开销非常大。例如,我可以每10分钟缓存一次。
发布于 2010-09-11 07:27:12
绝对不是那么回事。
建立索引比扫描整个表需要更多的时间,因此会严重降低性能。
只需构建一次索引,然后离开它。
发布于 2010-09-11 08:38:08
SELECT * FROM players ORDER BY `exp` DESC这需要读取整个表并对其进行排序。
mysql_query("ALTER TABLE `players` ADD INDEX ( `exp` )");
$query = mysql_query("SELECT * FROM players ORDER BY `exp` DESC");
mysql_query("ALTER TABLE `players` DROP INDEX `exp`");这需要读取整个表,对其进行排序,将排序结果写入磁盘,从磁盘读取它们,然后删除它们:所有这些操作都将表锁定。
第一种选择是更快更好的并发性。
如果你创建一个永久的索引,它会更快。
要担心DML性能,10k记录太少了。
发布于 2010-09-11 07:45:21
使用"one time“索引
O(n*log(n)) + O(n) + [cost of index delete - don't know this]生成索引
O(n) - in订购,但在INSERT和UPDATE exp column的同时,您有额外的时间
O(n)比O(n*log(n)) + O(n)快得多,然后你生成索引,然后离开这个列,但是如果你在ORDER by exp上有比ORDER by exp更多的更改,那么考虑不要索引这一列,因为它总体上更长。或者使用其他解决方案,如exp缓存订购的SELECT?
对于这个问题,SELECT的缓存结果可能是的最佳解决方案,但是不使用ADDING和DROPING INDEX执行此选择,因为这没有任何意义。
https://stackoverflow.com/questions/3689039
复制相似问题