1

我目前正在开发一个移动应用程序并使用 Codeigniter MySQL。我现在面临的情况是我有一张书表(这张表将有 100k+ 条记录)。在此表中,我有一个名为 NotSelling 的列。数据库示例:

Book A 45
Book B 0
Book C 159
Book D 78
.
.
.
Book Z 450

上面的数字是 db 的 NotSelling 列中显示的数字。我需要从这个大表中提取前 20 本书。现在我的解决方案是对表格进行排序,然后只使用TOP提取前 20 条记录。

我想知道的是关于表格排序的性能。我敢肯定,不断地对表格进行排序以获得前 20 个结果将花费非常长的时间。我已经得到了问题的解决方案:

  • 索引 NotSelling 问题。
  • 缓存查询(但我读过粗略的失效可能会导致问题,因为我的情况下失效频率会很高)
  • 对表进行排序,取出前 20 条记录,将它们放在另一个表中,然后每隔一小时左右定期更新表。

但是所有这些都说有没有人知道这个问题的更好解决方案,或者有一种方法/方法来优化我想要做的功能的性能?请注意,我是新手,所以如果有人能够指出我可以阅读有关数据库性能的正确方向,我将不胜感激。

4

3 回答 3

0

Depending on what kind of meta-data is kept inside of the data structure of the index backing the column, a traversal can likely be done in O(n) time with n being the number of items returned.

This means that in theory, whether you have 1 million or 200 trillion records, pulling the first 20 will be just as fast as long as you have an index. In practice, there is going to be a performance difference since a small index will fit in memory whereas a large one will have to use the disk.

So in short, you're worrying too much. As Srikar Appal, a properly indexed 100k record table is nothing to MySQL

于 2013-07-16T17:43:27.690 回答
0

不用担心排序的性能。如果它确实被证明是一个问题,那么以后总是可以通过添加一个索引在数据库中修复它。

在设计阶段,优化是一种干扰。相反,应关注实现代表问题的功能和直接性。只要这些都在目标上,其他一切都可以相对容易地修复。

于 2013-07-16T17:33:56.557 回答
0

我觉得你在这里想太多了。绝对是过早优化的情况。虽然上述所有解决方案都是完全有效的。您应该知道 100K+ 记录对 Mysql 来说是杂烩。我们过去经常处理超过order3000 万行的表格,而且性能非常好。

但是你必须在被排序的列上有索引,并仔细检查你的表模式。注册。缓存也不用担心,当表没有改变时,mysql会为你重复查询。但是列索引是必须的、主要的和最重要的要求。

于 2013-07-16T17:37:00.907 回答