2014-11-16 159 views
1

好的,首先让我告诉一下我想要做的事情。基本上,在我的学习期间,我用PHP编写了一个小型Web服务,根据长度,演员,导演,作家,流派等一些可测量的尺寸计算相似电影之间的相似程度。我用于此的数据基本上是一组数据从omdbapi.com获得。MySQL JOIN vs LIKE - 更快的选择?

我还有那个数据库,但它在技术上只是一个包含所有到每部电影的信息的单表。这意味着,对于每部电影,上述所有参数均以逗号分隔。因此,我迄今使用了一个使用LIKE语句封装所有这些东西的查询。该查询可能会变得非常大,因为我几乎会查询表中的每个参数,有时针对不同演员的5个不同的LIKE语句,对于导演和作者而言也是如此。当我上次使用此功能时,大约需要30到60秒才能输入一部电影并收到15个类似电影的列表。

现在我开始了自己的第一份工作,并在自由时间自学自我,我想在自己的网站上工作。因为我没有真正的想法来处理我想要做的事情,所以我想我会再次拿出我的老电影发现者,并且这次使用它。 现在要挑战自己,我希望整个事情变得更快。了解,数据从未改变,只能阅读。这也不是“真正”的关系,因为演员的名字和其他只是字符串,并没有其他地方真正的进入。这意味着具有相同的名字将被视为同一个演员。

现在,这里是我的实际问题: 假设我想我的选择查询更快地运行,这将是有意义的运行,其将逗号分隔字符串成额外的表脚本(这些是n到m的关系,看到的尝试下面),然后加入所有这些表(他们将是8或更多),或将使用LIKE,因为我目前的速度相同?我试图实现的唯一的事情是更快的选择查询,因为没有其他任何事情可以处理数据。

database structure movies structure

这是我现在有。请记住,我仍然必须为电影+每个表格之间的关系创建表格。这样做后,我可以删除电影表中的列,并最终不得不通过每个查询加入很多表格。我在这里可以看到的唯一真正的好处是,在个人表格上创建索引会比较容易,而不是一个(或几个)索引,以覆盖大型电影表格。

我希望所有这些都对你有意义。我很欣赏任何短或长的答案,就像我说的这主要是为了自学,因此我不需要一个真正的商业模式。

+0

阅读问题:** [在数据库列中存储分隔列表真的很糟糕吗?](http://stackoverflow.com/questions/3653462/is-storing-a-delimited-list-in-a -database-column-really-that-bad)**简短回答:**是的,这真的很糟糕。** – 2014-12-02 21:38:13

回答

2

我不明白你目前有什么。看起来你只显示表格的大小,而不显示其内部结构。您需要使用规范化规则将数据分隔到不同的表中,然后放入正确的索引。索引将使您的查询速度非常快。你的查询上面的大小是什么意思?您是否曾经为您的查询运行过EXPLAIN ANALYZE,并请发布查询,我无法从结果中猜出您的查询。 YT上有很多优化视频。

+0

我在一张图片中添加了一张表,显示了我目前的表格。你所说的基本上是我在想什么,我刚刚了解到JOIN会使一切都变得更慢,所以我不确定是否规范化数据(技术上甚至不是关系数据,因为我解释过它只是字符串,没有任何特别的)将带来速度的显着增加,而不是仅仅停留在JOIN之外,并且使用LIKE一列以逗号分隔值的列。 – Schaka 2014-11-16 16:37:23

+0

在目前的情况下,你有顺序扫描(扫描所有表)。并且使用索引更快。通过从封面阅读书籍来查找词语,或者通过使用书籍末尾的索引找到词语更快? – 2014-11-16 17:12:12

+0

JOINS本质上并不慢,我不明白“使用LIKE列”。或者这意味着你有几个'LIKE'表达式很慢。进行一些查询并运行'EXPLAIN ANALYSE查询',您将看到数据库(查询规划器)正在执行的操作。 – 2014-11-16 17:29:13