我正在构建一个能够处理许多不同搜索条件的动态 MySQL 用户搜索查询。我考虑编写一个存储过程,但最终在客户端构建查询(PHP 中的准备语句)。其中一个标准是能够搜索用户的年龄,即在 X 和 Y 岁之间。我想知道如何尽可能有效地做到这一点。最终查询将相当复杂,并且有多个连接,并且将来可能会在几百万行上运行,因此我需要尽可能优化它。我将用户的出生日期存储在具有格式的索引DATE
列中。YYYY-MM-DD
我有以下用于计算用户年龄的用户定义函数 (UDF):
RETURN (DATE_FORMAT(current_time, '%Y') - DATE_FORMAT(date_of_birth, '%Y') - (DATE_FORMAT(current_time, '00-%m-%d') < DATE_FORMAT(date_of_birth, '00-%m-%d')));
计算的细节并不重要;我更关心它是如何使用的。我担心的一个问题是,在我的 WHERE 子句中使用这个 UDF 会显着降低查询速度,因为它需要在每一行上运行,即使我使 UDF 具有确定性。我不能保证在检查年龄之前会有其他标准来缩小匹配行的范围。我不能只检查出生日期和日期,因为那是不准确的。我正在考虑是否将上述计算从 UDF 中提取出来并将其直接嵌入到查询的 WHERE 子句中是否会产生显着差异(我认为是的)。不利的一面是 WHERE 子句会因这样的计算而变得更加复杂(或者实际上是两个,除非有办法重用结果)。但我想没有办法避免这些计算。在 WHERE 子句中执行此计算是否是提高性能的方法,还是有更好的方法?
从理论上讲,我想我什至可以age
在表中添加一列user
并计算用户注册并每晚运行计划的作业/cronjob 以更新今天生日的用户的年龄(如果我可以有效地选择)。这肯定会加快我的搜索查询,但会引入冗余数据。因此,如果无法在搜索查询本身内有效地完成计算,我真的只想这样做。
所以,总结一下:我需要搜索年龄范围内的用户(例如 25 到 30 岁)。我应该在 WHERE 子句中计算年龄,还是会因为必须在每一行上完成而非常慢?这是我必须做出的牺牲,还是我有更好的选择?
任何帮助深表感谢。