首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该在一个页面中添加和删除索引吗?

我应该在一个页面中添加和删除索引吗?
EN

Stack Overflow用户
提问于 2010-09-11 07:23:44
回答 4查看 84关注 0票数 2

假设我有players表。它由3行组成(它有更多,但假设它只有3行)。member_id, name, exp。我在每个页面中使用member_id行,这就是为什么我只向member_id添加索引的原因。但是我想在一个页面上用最高的exp做一个顶级球员的列表。所以我做了这样的事情:

代码语言:javascript
复制
$query = mysql_query("SELECT * FROM players ORDER BY `exp` DESC");

如果我有10k个播放器,我不能在不向exp添加索引的情况下运行这样的查询。所以我的问题是,我是否应该这样做:

代码语言:javascript
复制
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分钟缓存一次。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-09-11 07:27:12

绝对不是那么回事。

建立索引比扫描整个表需要更多的时间,因此会严重降低性能。

只需构建一次索引,然后离开它。

票数 3
EN

Stack Overflow用户

发布于 2010-09-11 08:38:08

代码语言:javascript
复制
SELECT * FROM players ORDER BY `exp` DESC

这需要读取整个表并对其进行排序。

代码语言:javascript
复制
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记录太少了。

票数 1
EN

Stack Overflow用户

发布于 2010-09-11 07:45:21

使用"one time“索引

代码语言:javascript
复制
O(n*log(n)) + O(n) + [cost of index delete - don't know this]

生成索引

O(n) - in订购,但在INSERTUPDATE exp column的同时,您有额外的时间

O(n)O(n*log(n)) + O(n)快得多,然后你生成索引,然后离开这个列,但是如果你在ORDER by exp上有比ORDER by exp更多的更改,那么考虑不要索引这一列,因为它总体上更长。或者使用其他解决方案,如exp缓存订购的SELECT

对于这个问题,SELECT的缓存结果可能是的最佳解决方案,但是不使用ADDINGDROPING INDEX执行此选择,因为这没有任何意义。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3689039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档