我有两个表通过第三个表连接在一起。第一个表(图像)包含超过一百万条记录。第二个表(标签)包含大约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观察服务器活动,我发现了两件有趣的事情:
查询是:
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'
我开始认为我需要在该状态列上抛出一个索引。
答案 0 :(得分:1)
问题是双主键。作为双重,它基本上必须查看连接表中的每个记录。我为tag_id添加了一个键,为image_id添加了一个键,它大大提高了速度。谢谢Machavity!