Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL заявка за общи приятели

Е, единствената заявка, която може да работи до момента, е тази на Саймън... но това е наистина излишно - толкова сложна гадна заявка (2 подзаявки с 2 обединения!) за толкова просто нещо, че трябва да поставите награда? :-) И ако имате около 1000+ потребители, заявката ще бъде адски бавна - запомнете, че е квадратична и поради обединения в подзаявките, едва ли ще се използва някакъв индекс!

Бих предложил да преосмислите дизайна отново и да позволите 2 дублиращи се реда за приятелство:

id  Person1    Person2  status
1         1          2  friend
2         2          1  friend
3         1          3  friend
4         3          1  friend

Може да мислите, че това е неефективно, но следното опростяване ще позволи пренаписването на заявката до прости присъединявания:

select f1.Person2 as common_friend
from friends as f1 join friends as f2
    using (Person2)
where f1.Person1 = '$id1' and f2.Person1 = '$id2' 
    and f1.status = 'friend' and f2.status = 'friend'

което ще бъде адски бързо! (Не забравяйте да добавите индекси за Person1,2.) Препоръчал съм подобно опростяване (пренаписване подзаявки към обединения) в друга много неприятна структура от данни и това е ускорило заявката от вечността до блиц-мигновено!

Така че това, което може би изглеждаше като големи режийни разходи (2 реда за едно приятелство), всъщност е голяма оптимизация :-)

Също така, това ще направи заявки като "намерете всички приятели на X" много по-лесни. И няма да е необходимо да се харчат повече награди :-)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Проверете mysql връзката в sequelie

  2. DateTime група по дата и час

  3. Обща грешка:1005 при създаване на ключово ограничение - Laravel

  4. Създаване на MySQL събития в Amazon RDS

  5. PDO MySQL драйвер на Mac