三个表,Media(媒体表),Tags(标签表),MediaTagRef(中间表)
三个表数量分别是:Media 5w,Tags 5w,MediaTagRef 80w
现在需要做关键字过滤查找媒体,Media.name LIKE '%1%' OR Tags LIKE '%1%'SELECT
count(*)
FROM
(
SELECT
Media.id,Media.name
FROM
mc_media Media
LEFT JOIN mc_media_tag_ref TagRef ON TagRef.object_id = Media.id
LEFT JOIN mc_tags Tags ON Tags.id = TagRef.tag_id
WHERE Tags.name LIKE '%1%' OR Media.name LIKE '%1%'
#LIMIT 20
) c结果:651455
受影响的行: 0
时间: 7.113s返回结果需要7秒多,这个有点接受不了,是那里写错了吗?就算把like去了也要7秒。

解决方案 »

  1.   

    SELECT
    Media.id,
    Media. NAME
    FROM
    mc_media Media
    LEFT JOIN mc_media_tag_ref TagRef ON TagRef.object_id = Media.id
    LEFT JOIN mc_tags Tags ON Tags.id = TagRef.tag_id
    WHERE
    Tags. NAME LIKE '%1%'
    OR Media. NAME LIKE '%1%'
    LIMIT 20
    这样查询100ms以内,但无法知道总数,做不了分页。
    还请大家帮忙看看!!
      

  2.   

    从where条件来看,两个like 都是 %1% ,完全使用不到索引,性能当然会很差,另外需要观察索引的过滤性如何,一遍过滤性在10%以内都认为可以有效使用索引!
      

  3.   

    就算把LIKE去掉也要7秒以上
      

  4.   

    另外我有个想法,就是直接在Media里加一个tags字段保存媒体的标签,多个用','分隔,查询时就不用关联这么多表。
    不知道这种做法有什么弊端?