我的问题是选择最佳方法来完成工作。我将介绍目标和各种解决方案。
我有一个项目列表和一个类别列表。每个都可以属于多个类别。
items (id, name, ...other fields...)
categories (id, name, ...... )
category_items (category_id, item_id)
项目列表非常大,每10分钟更新一次(使用cron)。类别列表是固定的。
在我的页面上,我显示了一个很大的项目列表,我有类别过滤器。整个过滤在客户端javascript完成。原因是当前可用的项目限制为+ - 1000,因此所有数据(项目+类别)将一起加载。
此页面即将被多次查看,因此性能是一个问题。我有几个想法,都会带来良好的表现。在所有这些中,将发送完整的类别列表。但是......
使用join和group_concat运行单个选择。像这样的东西:
SELECT i。*,GROUP_CONCAT(ci。
category_id
SEPARATOR“,”)AS category_list 来自items
AS i LEFT JOINcategory_items
AS ci ON(ci。item_id
= i。id
) 在哪里...... GROUP by i。id
ORDER BY ...
使用上述
索引正确完成,因此所有方法都可以相对快速地运行。加入是一个繁重的操作,所以我的问题是关于(2),(3):
是仅在每个CRUD上更新的视图,还是在每次选择时计算的?如果它只在CRUD上更新,它应该与存储列大致相同。
请记住,items表会增长,只会选择最新的行。
答案 0 :(得分:1)
解决方案4.拥有MEMORY
类型表,该表将使用更新items
表的相同cron脚本更新解决方案1中的查询结果。
除此之外:1。和2.等同。 MySQL的视图没有实现,因此查询视图实际上将从第1点开始运行SELECT
。
答案 1 :(得分:1)
创建视图只是保存查询,(2)仍然会运行查询和连接。 (3)当然会以牺牲空间为代价来节省时间。
因此,答案是一个问题:你和你的应用价值时间或空间?
此外,您可以在category_items表上使用触发器,而不是使用cron来更新缓存字段(您的GROUP_CONCAT);