在到达一个大型MySQL数据库(比如100万行)后,确实提供了LIMIT帮助优化



我使用的是PHP 7、MySQL和一个小型定制论坛,以及一个将7列和2条SQL联接语句抓取到"最新帖子"页面中的查询。当我达到100万行时,限制30行会停止在30行吗?还是每次运行都必须对整个数据库进行排序?

我问这个问题的原因是,我正试图思考如何对我创建的这个自定义论坛进行分页,以及一旦(理论上)阅读了一百万行,分页是否会"正常"?

编辑:我目前的查询是限制30,排序desc.

第二版:目前我每天收到大约500-600个帖子,50个或50个。它很快就累积起来了,所以我试图在我拿到100万之前监控它。话虽如此,我现在只查找一个表,tblTopics和topic_id、topic_name和topic_author(fk)。然后,我用主题本身的外键、topic_rading和topic_category进行另一次查找。原始查找是我有排序和限制的地方。

Sort应用于全集,limit在排序之后应用,因此向ORDER BY查询添加limit不会使其更快。

这取决于情况。

SELECT ... FROM tbl ORDER BY x LIMIT 30;
INDEX(x)

可能使用索引并在30行后停止,而不是100万行。

SELECT ... FROM tbl GROUP BY zz ORDER BY x LIMIT 30;

将扫描所有一百万行,进行分组,写入一个tmp表,对该tmp表进行排序,然后只传递30行。

SELECT ... FROM tbl WHERE yy = 123 ORDER BY x LIMIT 30;
INDEX(yy)

可能更喜欢INDEX(yy),很难说它的效率有多高

SELECT ... FROM tbl WHERE yy = 123 ORDER BY x LIMIT 30;
INDEX(yy, x)

将非常高效——它不仅可以使用索引进行过滤,还可以使用ORDER BYLIMIT。只有30行将被触摸。

SELECT ... FROM tbl LIMIT 30;

用途可疑。你会得到一些30行,但谁知道是哪30行?但它会很快。

好吧,这仍然不能回答你的问题。您的问题涉及JOIN。你能猜出这个问题在涉及JOIN的情况下会变得多么复杂吗?

如果您想讨论特定于查询,请为每个表提供查询和SHOW CREATE TABLE,以及每个表中的行数。

如果将一个1行表连接到一个百万行表,那么1行表可能不会增加任何复杂性。

如果您在没有任何索引的情况下将200万个行表连接在一起,那么您将看到一个万亿的中间"行"!

哦,然后你会想要第二个30行吗?这增加了复杂性的另一个维度。我可以多花几段时间讨论OFFSET可能出现的问题。

如果这个论坛是开放式的,任何人都可以发布"主题"并成为原始作者,那么你可能至少想要一个主题表,上面有PKID、Name、author,还有添加日期和最近的帖子,以及针对它的帖子数。很多时候,人们建立的网站都需要计数器,并试图进行聚合,或者最近的,等等。来提到最近的帖子,也要持有最近帖子的ID,这样你就不必找到最长日期,然后根据它获得加入。

然后,第二个表将是与给定帖子相关联的详细信息。

然后,通过详细信息表上的触发器,无论您发布的内容是什么,您都可以更新父主题id,并在其上加上计数+1、当前最新日期和最后一个id以及刚刚创建的最新记录的id。

所以现在,连接以获得最新的上下文条目是一个简单的连接,而不是过于复杂。

最近发布日期的主题表索引,所以你现在得到的是ex:最近的30个主题,不一定是最近的30条帖子,比如3条帖子有很多点击量,占了所有30条。获取30个不同的主题,然后让用户在选择感兴趣的主题时查看详细信息。您的顶级查询永远不会违背底层细节。

显然,简要介绍了您网站的真实情况,但希望建议对您的运行有意义。

最新更新