[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вопрос по индексам. Укоротить количество
inpost
Получается по скриптам такая ситуация (запросы):
WHERE и варианты:
id_parent
id_parent, whosend
id_parent, ban
id_parent, ban, man_saw
id_parent, ban, girl_saw
id_parent, whosend, id_man, ban?
id_parent, whosend, id_girl, ban?

Что интересно, то id_parent может вернуть до 3-4 записей, то есть остальные подсчёты ban,man_saw,girl_saw идут среди этих 3-х записей.

Отсюда вопрос, как лучше сделать:
1) индекс для id_parent , остальные сам посчитает без индекса среди 3-4 записей.
2) под каждый запрос свой индекс, дофига индексов получится, тяжелая таблица станет.
3) сделать подсчёт этих 3-х записей внутри PHP скрипта. В большинстве своём происходит COUNT(), в некоторых местах SELECT записей. К примеру если взять запросы по id_parent + ban, то если мы будем иметь 10 записей, то редко когда 1 запись окажется в бане...

Я попробовал подсчёт в MYSQL делать, показалось, что если выставить индекс для id_parent, а искать id_parent + ban + man_saw , получается медленный запрос. Если взять все записи и вернуть в ПХП, а тут посчитать (3 случай), всё моментально.

Я что-то не так понимаю, как всё же лучше поступить в данной ситуации?

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Семён
Можешь показать для более яркого представления на конкретных примерах твои SQL запросы?
inpost
Получаем ID записей, которые подходят по условию. (подходят где-то 5 из 10 записей в таблице на 10млн. записей)
SELECT `id`
FROM `".IRB_DBPREFIX."mess`
WHERE `id_parent` IN (". intImplode($POST['array1']) .")
AND `ban` = 0
AND `man_saw` = 0


Тут проверяем, если ли запись в БД (так же 5 из 10 записей подойдут, тут уже проблема, что вернуть придется 10 записей, чтобы найти 1 совпадение).
SELECT `id`
FROM `" . IRB_DBPREFIX . "mess`
WHERE `id_parent` = ". $specialid ."
AND `whosend` = 'man'
LIMIT 1


SELECT *
FROM `" . IRB_DBPREFIX . "mess`
WHERE `id_parent` = ". (int)$GET['id'] ."
AND (`whosend` = 'man' OR (`ban` <> 1 AND `whosend` = 'girl'))
AND `id_man` = ".(int)$_SESSION['user_data']['id']."
ORDER BY `id` DESC


SELECT *
FROM `".IRB_DBPREFIX."mess`
WHERE `id_parent` = ". (int)$GET['id'] ."
AND (`whosend` = 'girl' OR (`ban` <> 1 AND `whosend` = 'man'))
AND `id_girl` = ".(int)$_SESSION['id_profile']."
ORDER BY `date` DESC



Проблема в том, что возвращает условие где-то 10 записей по поиску id_parent, то есть обработать 10 записей достаточно быстро можно за пределами mysql, при этом получается, что mysql будет выдавать лишние записи в PHP скрипт для обработки! Если делать на уровня mysql, у меня такое подозрение, что этот алгоритм как-то подозрительно работает, что работает гораздо медленнее из-за того, что индекс не по всем полям. При этом 300-500 мб займут дополнительные 4-5 индексов

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.