Кстати, я не до конца уловил идею твоей системе. Насколько я понял, когда пользователь прописывает тег для сущности, он (тег) у тебя добавляется в таблицу независимо от того, был уже такой до этого, или нет. Если так, то это, IMHO, и есть одна из проблем.
select count(*) from tagrelation;
+----------+
| count(*) |
+----------+
| 274125 |
+----------+
1 row in set (0.00 sec)
select count(*) from tag;
+----------+
| count(*) |
+----------+
| 49773 |
+----------+
1 row in set (0.01 sec)
select tag_title, count(*) as tag_weight from tag, tagrelation where tag_id = tagrelation_tag_id group by tag_id order by tag_weight desc limit 100;
...
100 rows in set (3.67 sec)