MySQL分区连接表(双PK)

时间:2013-11-20 04:10:52

标签: php mysql mysql-workbench

我有两个表通过第三个表连接在一起。第一个表(图像)包含超过一百万条记录。第二个表(标签)包含大约100K记录。第三个表是由image_id和amp;组成的双主键表。 tag_id,包含大约400万条记录。

我一直在努力确定一种加快按标签搜索图片的方法。在阅读了十几条记录之后,听起来我最好的办法是对连接表进行分区。不幸的是,我以前从未这样做过,并且害怕潜在地破坏系统中最大的表。

无论如何,由于该表是一个双主键,它被索引,但它仍然需要相当多的时间来查询。我不确定它是否严格来说是该表的速度,还是它是我加入的图像表的速度。无论哪种方式,我现在正在进行2-3次查询,我担心随着更多图像,更多标签和更多用户,我将进一步陷入困境。

所有查找都是使用INT(11)主键完成的。我从不进行文本搜索,也不查看varchar字段。一个查询会查看status CHAR(1)列。当然,状态不是指数,但应该是吗?我最初考虑使用A,I,X,D作为选项的ENUM,但从那时起我已经扩展到6种状态类型。

硬件方面,我的核心i-7极限配备24GB DDR3,MySQL存在于120GB SSD(仅3gbps)上。

我可以做些什么来加快速度?是瓶颈磁盘io,查询效率,内存损坏程度不佳?

作为后续注释,我一直在通过MySQL Workbench观察服务器活动,我发现了两件有趣的事情:

  1. 密钥效率为99.99%,而查询缓存命中率为0.28%。
  2. 我经常看到重新计算计数的cron作业处于“复制到tmp表”的状态。
  3. 查询是:

    SELECT COUNT(t.image_id) FROM Image_Tags t
    INNER JOIN (Images i) ON (i.image_id = t.image_id)
    WHERE t.tag_id = :tid
    AND i.status = 'A'
    

    我开始认为我需要在该状态列上抛出一个索引。

1 个答案:

答案 0 :(得分:1)

问题是双主键。作为双重,它基本上必须查看连接表中的每个记录。我为tag_id添加了一个键,为image_id添加了一个键,它大大提高了速度。谢谢Machavity!