mysql查看性能与额外列

时间:2012-02-18 16:30:42

标签: mysql performance join views

我的问题是选择最佳方法来完成工作。我将介绍目标和各种解决方案。

我有一个项目列表和一个类别列表。每个都可以属于多个类别。

items          (id, name, ...other fields...)
categories     (id, name, ...... )
category_items (category_id, item_id)

项目列表非常大,每10分钟更新一次(使用cron)。类别列表是固定的。

在我的页面上,我显示了一个很大的项目列表,我有类别过滤器。整个过滤在客户端javascript完成。原因是当前可用的项目限制为+ - 1000,因此所有数据(项目+类别)将一起加载。

此页面即将被多次查看,因此性能是一个问题。我有几个想法,都会带来良好的表现。在所有这些中,将发送完整的类别列表。但是......

  1. 使用join和group_concat运行单个选择。像这样的东西:

      

    SELECT i。*,GROUP_CONCAT(ci。category_id SEPARATOR“,”)AS category_list       来自items AS i       LEFT JOIN category_items AS ci ON(ci。item_id = i。id)       在哪里...... GROUP by i。id ORDER BY ...

  2. 使用上述

  3. 创建视图
  4. 将GROUP_CONCAT结果存储为附加列。这只会在cron下每隔几分钟更新一次。
  5. 索引正确完成,因此所有方法都可以相对快速地运行。加入是一个繁重的操作,所以我的问题是关于(2),(3):

    是仅在每个CRUD上更新的视图,还是在每次选择时计算的?如果它只在CRUD上更新,它应该与存储列大致相同。

    请记住,items表会增长,只会选择最新的行。

2 个答案:

答案 0 :(得分:1)

解决方案4.拥有MEMORY类型表,该表将使用更新items表的相同cron脚本更新解决方案1中的查询结果。

除此之外:1。和2.等同。 MySQL的视图没有实现,因此查询视图实际上将从第1点开始运行SELECT

答案 1 :(得分:1)

创建视图只是保存查询,(2)仍然会运行查询和连接。 (3)当然会以牺牲空间为代价来节省时间。

因此,答案是一个问题:你的应用价值时间或空间?

此外,您可以在category_items表上使用触发器,而不是使用cron来更新缓存字段(您的GROUP_CONCAT);