对于数据库管理,我还是个新手,所以请放轻松!
我有一个 MySQL 数据库。其中大约有 100 个表。目前,每个表大约有 50 行。因此,当从这些行中选择一行时,查询时间约为 0.0004 秒。
现在,我的问题是:假设其中一个表增长到大约 500 万行。那么,如果我只想从该表中选择 1 行,它的查询时间会增加吗?大约会增加多少?
如果是,那么表增长后我该怎么做才能减少查询时间?
表的一点背景:每个表大约有 10 到 11 列。其中大约 4 到 5 列是长度为 11 的整数,1 列是 longtext,其他列是长度为 255 的 varchar。
想象一下电话簿。
如果电话簿是一个大城市,有数千或数百万人口,那么搜索名字是否需要更长的时间?
是的,当然有。
但是,电话簿中姓名的数量增加一倍并不意味着搜索姓名所需的时间增加一倍。我们不会从头到尾搜索电话簿。我们利用姓名按字母顺序排列这一事实。
在有序集合中搜索比从前到后搜索效率高得多。我们从中间开始,看看我们要搜索的名字按字母顺序排列在中间条目之前还是之后,这样一步就可以排除一半的书。
然后,我们查看已知包含要搜索的名称的那一半的中间点,并再次检查该名称是在该中间点的条目之前还是之后。同样,我们可以一步消除剩余的一半。
继续使用此方法,直到找到名字。这可能需要将搜索范围减半,直到只有一个名字。
这是通过二进制细分进行的搜索,其所花的步骤数与书中姓名数量的对数2一样多。
将书的尺寸增加一倍,步骤数最多只会增加一次“减半”。
这就是索引为我们所做的。较大的书确实需要更长的搜索时间,但只是一点点。
要想更多地了解这一点,我推荐我的演示文稿《如何真正设计索引》。
YouTube 上有我做此演讲的视频https://youtube.com/watch?v=ELR7-RdU9XU。
会增加吗?几乎肯定会。会增多少?和所有事情一样,这要视情况而定
。
如果您通过唯一索引字段上的单个值查找行,则查询可以使用索引(可能是主键下的索引),因此访问速度会很快。
如果您通过其他效率较低的方式(例如,带有前导通配符的 varchar/text 字段)查找行
like "%FRED"
,则查询可能会进行表扫描...并且按顺序读取 5M行将需要一段时间。最重要的是,我们只能提出建议和猜测。您可以通过测试
来找到确切答案。(是的,测试不仅仅适用于开发人员!)
创建一个“测试”数据库,加载[测试]数据并尝试。
查看查询的解释计划,然后开始调优。
对于数据库查询调优,没有“简单的答案”。你只需要亲自尝试一下。