- 始终使用不同的WHERE子句查询我需要的确切行。
- 将整个表格加载到我的应用程序内存缓存中进行搜索,并定期同步缓存。
- 始终查询整个表(无WHERE子句),让SQL服务器处理缓存(它总是相同的查询,因此可以缓存结果),并根据需要过滤输出。
我认为,一个专门设计用于快速搜索、切片和分析信息的系统,在这方面肯定比普通开发人员的代码要快得多。然而,你没有提到的一些因素包括数据库服务器的位置或潜在位置与应用程序之间的关系 - 在较慢的网络上返回大量数据集肯定会使“获取所有数据并在本地搜索”选项更有优势。我认为,在“一般”情况下,我建议只查询您想要的内容,但在特殊情况下,其他选项可能更好。
我坚信在初始情况下应优先选择选项1。当您遇到性能问题时,可以考虑如何使用缓存进行优化(Dijkstra曾说过,预优化是万恶之源)。
同时,请记住,如果您选择选项3,您也将通过网络发送完整的表内容,这也会影响性能。
根据我的经验,最好查询你想要的内容,然后让数据库找到最佳的执行方式。你可以检查查询计划,看看是否有任何瓶颈可以通过索引来改善。
首先,让我们排除#2。查询表格是数据服务器存在的原因,它们几乎肯定会比您做的任何临时搜索工作都更好。
对于#3,您只需要说“根据需要过滤输出”,而不说过滤器在哪里完成。如果像#2一样在应用程序代码中,那么你就与#2有同样的问题。
数据库是专门为解决这个确切的问题而创建的。 它们非常擅长这样做。 让它们来处理。
除非 WHERE 子句本身非常庞大(即如果您的 WHERE 子句单独标识每一行,例如 WHERE id = 3 or id = 4 or id = 32 or ...),否则唯一使用选项1的原因是。
还有其他因素会改变您的数据吗?让SQL引擎最优地切片和切块的观点是很好的。但是,如果您正在使用数据库并且没有可能出现“其他人”更改数据,那将是令人惊讶的。如果可以在其他地方进行更改,您肯定希望经常重新查询。
相信SQL服务器会比你自己做缓存和过滤更好(除非性能测试表明不然)。
请注意,我说的是“负担得起”,而不仅仅是“做”。你很可能能够做得更好,但你被付费(大概)提供功能而不是缓存。
问问自己...花时间编写缓存管理代码有助于您实现需求文档吗?
如果你这样做:
SELECT * FROM users;
MySQL 应该执行两个查询:一个用于了解表中的字段,另一个用于返回您请求的数据。
正在处理中
SELECT id, email, password FROM users;
由于字段是明确的,因此mysql只能访问数据。
关于限制:始终最好查询您需要的行数,不多不少。更多的数据意味着驱动它所需的时间更长。