了解非索引的mysql限制

Posted

技术标签:

【中文标题】了解非索引的mysql限制【英文标题】:understanding mysql limit with non indexed 【发布时间】:2020-06-23 20:39:52 【问题描述】:

我有这个非常简单的查询,但由于某些限制,我不想在这里使用索引。

所以我担心的是,如果我们在 where 子句中调用非索引项,如何避免服务器上的巨大负载。

我觉得解决方案是有限的。 我确信有 1000 行中的数据,所以如果我使用限制,我可以检查可用值。

SELECT * 
from tableA 
where status='1' and student='$student_no' 
order by id desc 
limit 1000

这里的学生列没有在 mysql 中建立索引,所以我担心它会在服务器中造成巨大的负载

我尝试了解释,它似乎没问题,但问题是表中的行数较少,而且你知道 mysql 会因为更多的数据(如数百万行)而发疯。

那么我有什么选择??

我应该为学生添加索引?? 如果我要添加索引,那么我不需要限制 1000 行。一行就足够了,正如我所说,表将有几百万行,所以它需要大量空间,所以我想避免索引学生列,其他查询是 1000 行,desc 行不应该导致服务器上的负载作为 id已编入索引。

任何帮助都会很棒

【问题讨论】:

您是否使用 LIMIT 只是为了让数据库在前 1000 行中“搜索”?换句话说,您是否只是为了性能而使用 LIMIT ?只是为了澄清 @EEAH 是的。如果我不使用限制,它将搜索数百万个数据 这段代码容易受到sql注入的影响,所以请使用带参数的预处理语句参见***.com/questions/60174/… @sujara 如果在前 1000 行中没有找到任何记录会怎样? mysql 仍将搜索所有行,以找到匹配项,应保留 Status 和 student 的索引。所以试试吧 【参考方案1】:

你说:

但由于某些限制,我不想在这里使用索引...

还要说:

如何避免服务器负载过大...

如果您不使用索引,您将在服务器上产生“巨大的负载”。如果您希望此查询占用较少的资源,则需要添加索引。对于上述查询,理想的索引是:

create index on tableA (student, status, id);

这个索引应该使您的查询非常快,即使有数百万行。

【讨论】:

【参考方案2】:

LIMIT 100 不会强制数据库搜索前 100 行。 它会在找到 100 个匹配项后停止搜索。

所以它不用于性能。

在下面的查询中

SELECT * 
from tableA 
where status='1' and student='$student_no' 
order by id desc 
limit 1000

查询将一直运行,直到找到 1000 个匹配项。 不必只搜索前 1000 行

这就是上述查询的行为:

int nb_rows_matched = 0;
while (nb_rows_matched < 1000)
  search_for_match();

【讨论】:

以上是关于了解非索引的mysql限制的主要内容,如果未能解决你的问题,请参考以下文章

MySQL(12)-索引

MySQL面试常见题目

深入了解MySQL的索引

Mysql索引的类型

Mysql索引

Mysql 索引优化分析