了解非索引的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限制的主要内容,如果未能解决你的问题,请参考以下文章