Re: Діалоги / 2 користувача
А чому не одна таблиця Message:
id | message_text | from_user | to_user
?
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → Бази даних → Діалоги / 2 користувача
А чому не одна таблиця Message:
id | message_text | from_user | to_user
?
А чому не одна таблиця Message:
id | message_text | from_user | to_user
?
Тому, що це ускладнить/уповільнить вибірку з великої кількості повідомлень, які ніяк не зв'язаних з "унікальними" діалогами.
VTrim, так що там із вашим і моїм запитом. Цікаво ж що показує там ваш explain, ну або хоча б що показує ваш спосіб -
визначення швидкості "на око".
Можна ще так спробувати:
[code=sql]select
if(d.first_user = 1, u2.name, u1.name) as second_user_name
from dialogs as d
join user as u1
on d.first_user = u1.id
join user as u2
on d.secound_user = u2.id
where 1 in(d.first_user, d.second_user)[/code]
ktretyak, поки не перевіряв.
Два джоіна однієї таблиці для цього? Х.з-х.з..
Тобто ви створили тему, яка для вас не дуже то й актуальна? Чи ви іншим шляхом пішли? Все одно цікаво - яким.
ktretyak, поки не перевіряв.
Два джоіна однієї таблиці для цього? Х.з-х.з..
Ото ж бо й воно. Ви гляньте спочатку на плани виконання, а потім буде рахувати кількість джоїнів. У вашому запиті, наведеному на початку теми, оптимізатор взагалі може не користується індексами, навіть при їх наявності, через оту вашу умову з if при джоїнах.
Ні, я просто тестував один з сервісів для вебсокетів, ну і вирішив протестувати на модулі пошти між користувачами. Хоч це ніяк не звязано з бд на пряму, але чомусь згадав цей момент з діалогами.
Та ну, перестаньте, на двох рядках не протестуєте.
Ну і вже проблему з таблицею діалогів видно, бо індекси не використовуються.
Та ну, перестаньте, на двох рядках не протестуєте.
Ну лінь мені забивати інформацію туди . Ну час виконання поки не порівнюмо.
Ваш перший варіант.
Ну і вже проблему з таблицею діалогів видно, бо індекси не використовуються.
Так, поки що нічого не додавав.
Та ні, це не тестування. Треба зробити або усе на продакті, або на тестовому серваку, який має ідентичну структуру таблиць, включаючи індекси...
Якщо маєте бажання, скину дамп двох таблиць, зробите грамотний розбір. Думаю, багатьом буде цікавий результат.
Коли вам лінь, то мені ще більше лінь. Не бачу проблем щоб відновити дамп через ваш той PHPMySQLAdmin, після чого глянути плани виконання.
Вибирав не той id (не id співрозмовника взагалі, чомусь), коли виправив, запит пришвидшися в 2 рази.
SELECT
u.name as username,
u.id as to_id
FROM
users u
LEFT JOIN
dialogs d
ON u.id = IF(d.first_user = 1, d.second_user, d.first_user)
WHERE
d.first_user = 1
OR d.second_user = 1
Якщо порівнювати з вашим першим, то "на око", мій - 0.0011 - 0.0013 с. , ваш 0.0015 - 0.0017 с.
Ну а другий ваш варіант в районі 0.0025.
Я не стверджую, що краще, там дійсно все може залежити і від кількості даних і від заліза, на якому крутиться.
Залишу це тим, хто вже мав справу з подібним. Бо все одно під подібними тестами тільки срачі.
ваш 0.0015 - 0.0017 с.
Мій з union all чи самий останній?