Оптимизация структуры БД

LONGMAN

Dark Side of the Moon..
Оптимизация структуры БД

Если в таблице есть поля row1 (INT PRIMARY KEY), row2 (INT), row3(TEXT) и у меня есть запрос SELECT * FROM table WHERE row1 = $val1AND row2 = $val2 то лучше будет сделать row2 ключом?
 

DiMA

php.spb.ru
Команда форума
это ты дяду спрашиваешь, кого примари кеем сделать?
индекс добавь на поля, используемые в where
 

LONGMAN

Dark Side of the Moon..
Автор оригинала: tashkentchi
Нафиг ему индекс, если он значение примари знает?
Ты прав, я ступил :) Ещё есть такой вопрос, имеется таблица где хранится записки юзеров по их id. как из этой таблицы с помошью одного запроса подсчитать и вывести записки нескольких id? На пример id=10, id=20, id=30, id=40 и id=50.
 

tashkentchi

Новичок
Делай это двумя запросами.

1. Подсчитать число записок на каждый данный id. Спросишь COUNT при GROUP BY id

2. Выдать список записок. - Обычный SELECT где id IN (...)

И не нужно пытаться эти запросы объединять.
 

LONGMAN

Dark Side of the Moon..
tashkentchi спасибо. Вот ещё вопрос, имеется таблица ipsoft для хранения ip и user_agent забанённых юзеров. На каждом странице делается запрос (SELECT * FROM `ipsoft` WHERE `ip` = $ip AND `soft` = $soft LIMIT 1). Как вы думаете, лучше сделать индекс на полях ip, soft? Или по каким принципом принято осушествить модуль банов? Может есть решение оптимальнее
 

tashkentchi

Новичок
Индекс на `ip` и индекс на `soft`.

Про каждую страницу не понял. У вас в коде этот запрос один раз написан или пишите его на каждой странице? В первом случае все ок, во втором - нет.

Я аналогичного рода проверку делаю один раз при открытии сессии.
 

LONGMAN

Dark Side of the Moon..
Если проверить бан только при входе юзера и потом забанить его, ведь он остаётся на сайте до того как его сессия не умрёт. Ведь сразу не выкинет.. И ещё, как на этих полях лучше индекс поставить, пример пожалуйста..
 

tashkentchi

Новичок
Я сделал так: В сессии хранится массив ролей, доступных юзеру. Этот массив создается в начале сессии. Он может быть изменен в случае авторизации юзера.

С определенных IP я запрещаю/разрешаю юзеру иметь те или иные роли. Соответственно, в начале сессии я проверяю, можно или нет дать юзеру с этим IP те или иные роли.

Отправить IP в бан - это для меня тоже самое, что запретить для данного IP все роли. Если массив ролей пуст, посетитель видит пустую страницу. Сколько бы он не шарился, в течении всей сессии я на него даже запроса не потрачу :)

Но в общем-то бан - очень редкое явление. Чаще этот механизм используется для того, чтобы ограничить права админа, если он заходит на сайт не с рабочего места.

Например, роль 'admin' запрещается для всех IP и разрешается только для конторского. После этого, в админку сайта можно зайти только с рабочего места.
 

LONGMAN

Dark Side of the Moon..
А на счёт индексов? Как его правильно поставить для этих полях?
 

LONGMAN

Dark Side of the Moon..
Это я понял но разные индексы или составной? P.S. KEY и INDEX синонимы?
 

LONGMAN

Dark Side of the Moon..
Спасибо большое. А можете оъяснить в чём смысль саставного индекса? И чем отличается от вышенаписанного
 

x-yuri

Новичок
А можете оъяснить в чём смысль саставного индекса?
например, если у тебя есть запрос типа SELECT ... ORDER BY key_col_1, key_col_2, то индекс (key_col_1, key_col_2) ускорит выполнение этого запроса
что касается первичного ключа - он не всегда может быть представлен одним столбцом
 

LONGMAN

Dark Side of the Moon..
А в случае моего запроса SELECT * from ipsoft WHERE ip='ip' AND soft='soft' LIMIT 1 не лучше сделать саставной индекс? Типа KEY (ip, soft)
 

tashkentchi

Новичок
Чем гадать, лучше эксперимент поставьте. Ответ зависит от того, как распределены конкретные данные.

Кстати, если все пары (ip, soft) уникальны (telepathy mode), то следует поставить на эту пару уникальный ключ.
 
Сверху