Many to many - це в першу чергу про проектування самої бази, а не про запит.
Наприклад, маємо table1 і table2.
В table1 є ID:
В table2 є ID:
11,22,33,44,55,66,77,88,99
Тепер маємо таблицю many_to_many_table1_table2, в якій є дві колонки: ID1 i ID2.
Значення:
ID1,ID2
1,11
1,22
2,33
3,33
4,33
Сподіваюся, ця демонстрація дає можливість зрозуміти суть поняття many to many.
----
А оптимізація запитів - це наприклад про індекси. Індекси повинні створюватися для кожної сукупності join i where.
Наприклад, якщо table123 джойниться з table234 за колонками table123.column1 = table234.column1 і при цьому ми робимо where за колонкою table123.column2, то:
1) на таблиці table123 повинен бути "мульти-індекс" - це я так називаю один індекс одночасно для двох колонок - column1, column2
2) на таблиці table234 повинен бути індекс для колонки column1.
Якщо таких індексів не існує, то виконується full table scan, що за умови великої кількості даних в таблицях дає низький перфоменс.
Також оптимізація - це ще й про сам сервер, наприклад якщо на ньому вже існує хаос, тобто виконується багато запитів без створених для цього індексів, то оптимізовувати конкретно ваш запит може не мати надто багато сенсу; натомість потрібно визначити які запити "найважчі" і почати з найгіршого. Бо якщо сам сервер завантажений чимось значно важчим, то оптимізовувати ваш запит з 5 секунд до 3 секунд має не надто багато сенсу.
----
Якщо ж ви маєте на увазі щось інше, то поясніть що саме ви вкладаєте в ваше поняття "many to many" і в поняття "оптимізації". Я часом вигадую власні терміни, як ось "мульти-індекс" і це цілком ок; гірше якщо вигаданий мною термін вже існує, але загальноприйнята версія цього терміну означає щось зовсім інше.