编程

18条优化Laravel 数据库查询的建议(13-15)

1014 2021-12-25 01:07:53

13. 避免在where条件中 使用 SQL 函数中

最好能够避免在where中使用sql函数,因为会导致全表扫描。查询某个日期的数据,我们通常会这么做:

$posts = POST::whereDate('created_at', '>=', now() )->get();

会产生查询语句:

select * from posts where date(created_at) >= 'timestamp-here'

以上查询会导致全表扫描,因为where条件会等到date函数评估后才会生效。

我们可以重构避免使用sql函数date

$posts = Post::where('created_at', '>=', now() )->get();
select * from posts where created_at >= 'timestamp-here'

14. 避免一个表添加太多字段

最好要限制一个表的总行数。像mysql这样的关系型数据库,可以将一张表分成多张分表。可以使用主键和外键将他们连接起来。

一个表中添加太多数据,会增加每一条记录的长度,降低表的扫描速度。当使用select * 查询时,你会读取到很多并不需要的字段。

15.带有text 数据类型的字段分离到独立的表中

这个建议来自于个人经验,并不是数据库架构操作标准。当你有太多记录且增长迅速的时候,建议采用此法。

如果一张表中有些字段存储了大量的数据(比如text数据类型),最好将大数据量的字段分离出来到独立的表中,或者放到访问频率较低的表中。当字段中有大数据量,每条数据的增长会很快。个人的观察,它会影响查询时间。比如你有一张post表,表中content字段存储着博客文章内容。博文中的内容会非常大,而且通常只有在用户浏览博客详情页的时候才需要这些数据。因此当你有很多博文的时候,将其从posts表中分离出来可以明显改进查询效率。