Но есть и проблема. А именно, время добавления новой записи.
$sql = "INSERT INTO table (domen,time) VALUES ('".$link."', ".time().")";
При двух простых индексах операция занимала меньше 0.001 секунды, при составном индексе она занимает 0.01 секунды, и я так понимаю, будет быстро расти мо мере разрастания таблицы.
_____________
Бесплатному сыру в дырки не заглядывают...
Цитата (FatCat @ 8.03.2016 - 13:14) |
При двух простых индексах операция занимала меньше 0.001 секунды, при составном индексе она занимает 0.01 секунды, и я так понимаю, будет быстро расти мо мере разрастания таблицы. |
Естественно, во втором случае имеем более сложную структуру, соответственно требуются большие затраты на обновление узлов индекса, ко всему прочему при изменении индекса он блокируется, что также приводит к снижению производительности.
Конкретно твой случай легко решается в postgres использованием частичного индекса.
P.S. Что ж за день, я сегодня как в гостях на форуме
_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
Цитата (sergeiss @ 8.03.2016 - 09:44) |
Выбираешь ту единственную запись и смотришь, какое у неё время. В этом случае, кстати, может быть нужно просто пересмотреть структуру БД? |
Сами учили решать такие задачи на уровне DB :)
mysqli_num_rows(mysqli_query($link, "SELECT * FROM `table` WHERE `id пользователя` AND `время` > NOW() - INTERVAL 5 MINUTE");
_____________
Принимаю заказы, писать в ЛС
sergeiss
9.03.2016 - 14:13
Цитата (Медведь @ 9.03.2016 - 08:26) |
Сами учили решать такие задачи на уровне DB :) |
Ну так я и не отказываюсь от своих слов ;) Тока тебе что ни предложи, ты всё сомневаешься. Вот уж и предлагаю разные варианты.
Кстати говоря, можно вот так вот извращнуться с запросом, чтобы использовать только один индекс по айди, но при этом получить то, что ты хочешь.
SELECT * FROM
(
SELECT * FROM `table` WHERE `id пользователя`
) ini_sel
WHERE `время` > NOW() - INTERVAL 5 MINUTE"
Индекс по айди должен быть использован при работе подзапроса, а для выборки по времени никакой индекс уже не нужен - подзапрос вернет всего одну строку или ни одной. То есть, индекс по времени тебе вообще не надо создавать.
_____________
*
Хэлп по PHP*
Описалово по JavaScript *
Хэлп и СУБД для PostgreSQL*
Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. *
"накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)
Цитата (sergeiss @ 9.03.2016 - 10:13) |
Кстати говоря, можно вот так вот извращнуться с запросом |
Действительно извращнуться, бесполезное действие с подзапросом.
_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
Я уже на обе колонки поставил, когда таблица вырастет, сделаю эксперимент )) А пока так пусть будет.
_____________
Принимаю заказы, писать в ЛС
sergeiss
9.03.2016 - 14:53
Цитата (T1grOK @ 9.03.2016 - 14:45) |
бесполезное действие с подзапросом |
Ну не скажи. Если мы делаем сразу 2 условия, то они должны проверяться одновременно. И тут мы или используем индекс по айди, а по времени анализируется "как есть", т.е. последовательно. Или же мы делаем индекс по 2-м полям сразу - но Медведь не хочет.
В этом же случае в подзапросе время никак не фигурирует, не анализируется, выборку анализ времени не тормозит.
Вообщем, надо проводить натурные испытания для сравнения скоростей

Цитата (Медведь @ 9.03.2016 - 14:50) |
Я уже на обе колонки поставил |
На обе - это составной индекс ты имеешь ввиду?
_____________
*
Хэлп по PHP*
Описалово по JavaScript *
Хэлп и СУБД для PostgreSQL*
Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. *
"накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)
Цитата (sergeiss @ 9.03.2016 - 10:53) |
Ну не скажи. Если мы делаем сразу 2 условия, то они должны проверяться одновременно. И тут мы или используем индекс по айди, а по времени анализируется "как есть", т.е. последовательно. |
Без разницы. Ты вытащил из индекса id пользователей, но чтобы проверить данные времени, каждая строка с диска, так или иначе будет считана для проверки.
_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
Цитата (sergeiss @ 9.03.2016 - 14:53) |
Или же мы делаем индекс по 2-м полям сразу - но Медведь не хочет.
На обе - это составной индекс ты имеешь ввиду? |
Как это не хочу, сделал уже.
Ага.
_____________
Принимаю заказы, писать в ЛС
sergeiss
9.03.2016 - 15:32
Цитата (T1grOK @ 9.03.2016 - 15:02) |
Без разницы. Ты вытащил из индекса id пользователей, но чтобы проверить данные времени, каждая строка с диска, так или иначе будет считана для проверки. |
В данном случае для запроса, который я написал, не совсем так. Сначала подзапрос вытащит те строки, которые соответствуют условию по айди, это будет либо одна строка, либо ни одной. Тут индекс по айди отработает, как положено. А потом уже будет оцениваться время - во внешнем запросе. Но без индекса, так он тут просто не нужен будет.
_____________
*
Хэлп по PHP*
Описалово по JavaScript *
Хэлп и СУБД для PostgreSQL*
Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. *
"накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)
Цитата (sergeiss @ 9.03.2016 - 11:32) |
Сначала подзапрос вытащит те строки, которые соответствуют условию по айди... |
В обычном запросе произойдет то же самое, сначала отфильтруются по индексу данные, потом субд сходит на диск, извлечет нужные строки и выполнит дополнительные сравнения.
_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
P.S. Кстати в случае с подзапросами, если это Mysql, нужно быть очень осторожным, так как подобные вещи оптимизатор часто обрабатывает неадекватно, поэтому подзапросы являются очень слабой стороной данной СУБД.
_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
Какое-то безумие творится-не понимаю что вы обсуждаете. Аж мозги кипят так пытаюсь понять что я не понимаю что вы такое понимаете!
Вроде все кажется очевидным, ан нет! Три страницы (три!!!) обсуждается задача выборки из таблицы с уникальным первым ключом в запросе.
_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
GETТы еще внес свою лепту в теме сообщением)
Нас хлебом не корми, дай что нибудь пообсуждать и поспорить
_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.