
Subb98
09.04.2017
09:42:46
Суть такова. Будут записи со значением 0, они должны быть в базе, но постоянной работы с ними не будет. Вернее, она будет, но не такая активная. И будут все остальные записи, которые будут проверяться таском каждые 25 сек., истёк ли у них timestamp.
Вот, собсно, и должны попасть в выборку только "активные" записи.

Dmitriy
09.04.2017
09:43:54
Значит between
Т.к. нужно диапазон хватать

Google

Dmitriy
09.04.2017
09:44:17
И индексы не забудь
А эвент делать можно и реже

Subb98
09.04.2017
09:44:47
Угу, сейчас explain'ом прошёлся, фильтрация увеличивается, но всё равно по всем строкам проходится.

Dmitriy
09.04.2017
09:45:51
Можно селектить с таймштампом
И тогда в выборку они попадать не будут

Subb98
09.04.2017
09:47:11
То есть, после SELECT указать timestamp и это автоматически отсеет нули?

Dmitriy
09.04.2017
09:47:29
Нет, ща распишу
Мне нужно было селектить живые записи, которые не протухли по timestamp
Я сделал отдельное поле active 0/1 значения

Subb98
09.04.2017
09:54:41
У меня будет даже не SELECT. У меня будет DELETE всех записей, которые имеют timestamp > 0, и которые при этом должны быть удалены на текущий момент (определяем по timestamp). Записи с нулями хранятся вечно.

Dmitriy
09.04.2017
09:54:53
Ааа
Ну я продолжу

Google

Subb98
09.04.2017
09:56:00
Угу

Dmitriy
09.04.2017
09:56:01
Живую запись доставал: where active = 1 and timestamp > unix_timestamp(now())
А потом евент повесил раз в пол часа обновлять поле active
Нагрузка нормально просела прям
До этого 2 раза в минуту чекал
Правда у меея база 30гб)

Subb98
09.04.2017
09:58:39
Гм, я вот думаю, будет ли у меня возможность вешать event. Т.к. буду работать через сторонний скрипт и напрямую доступа к БД не будет, ну, то есть, только общение посредством запросов.
В настройки mysql не лезем.
И БД будет конечно не таких объёмов =)

Dmitriy
09.04.2017
09:59:26
Зависит от прав
Если мускул не даст, то cron - наше все
Но там минимальный период - 1 минута

Subb98
09.04.2017
10:00:35
Ну тогда это точно не мой вариант, юзеры тупо не разберутся с этим. Пишу под http://amxmodx.org/api/

Dmitriy
09.04.2017
10:00:53
Можно извратиться через && запускать скрипты и слипить

Subb98
09.04.2017
10:01:55
Прикол ещё в чём. БД окажется на каком-нибудь shared хостинге. И у юзера не будет возможности всё детально настроить.
Как вариант

Dmitriy
09.04.2017
10:02:15
Это возможно
Для базы - vps)

Subb98
09.04.2017
10:03:46
Поэтому, к сожалению, я пока ориентируюсь только на оптимизацию запросов, но задачи придётся реализовывать при помощи скрипта + запросов, как это не печально.

Dmitriy
09.04.2017
10:05:04
Ну при индексе по timestamp будет работать быстро

Google

Subb98
09.04.2017
10:05:37
Ну да, только unique боюсь делать.
Придётся обойтись обычным.

Dmitriy
09.04.2017
10:05:50
Не нужно там uniq
Двух записей в секунду не будет?

Subb98
09.04.2017
10:06:23
Это возможно.

Dmitriy
09.04.2017
10:07:04
Ну я о том, что будут записи, которые в одно время протухнут

Subb98
09.04.2017
10:07:33
Да, такое вполне может быть. За секунду скрипт вполне может добавить несколько записей одновременно.

Dmitriy
09.04.2017
10:08:59
Значит никаких уников

Subb98
09.04.2017
10:09:13
+
Всё-таки решил избавиться от нуля, изменил запрос таким образом:
SELECT * FROM `some_table` WHERE `timestamp` <= UNIX_TIMESTAMP() IS NOT NULL

Dmitriy
09.04.2017
12:51:51
0 и null разные значения
И условие это не отработает
Ты на null проверяешь unix_timestamp текущий

Subb98
10.04.2017
09:22:07

Aleksey
10.04.2017
20:15:57
А у тебя запрос не дольше будет отрабатывать . Тут тебе нужно будет проверять 2 типа значений число и нулл , а так индексы построил и поиск быстрей ?

Subb98
10.04.2017
20:24:36
Если честно, не проверял. Построю временную БД и поиграюсь как следует с explain'ом.
*временную таблицу, БД есть уже, по сути

Aleksey
10.04.2017
20:25:32
Отпиши потом результат , а то любопытно

Subb98
10.04.2017
20:25:52
ОК, на днях сделаю.

Google

Super
12.04.2017
05:41:23
Добрый день!Подскажите, пожалуйста, как к каждому amount прибавить сумму предыдущих.

Egor
12.04.2017
05:47:30
SQL-кодом?

Subb98
12.04.2017
06:12:19
https://www.w3schools.com/sql/sql_func_sum.asp - оно?

Super
12.04.2017
06:15:40
>.SQL-кодом?
да

Egor
12.04.2017
06:22:59
это нужно сделать один раз:
?

Super
12.04.2017
06:25:29
Для каждой даты прибавить сумму предыдущих. К примеру
1434
1434 + 1435
1434 + 1435 + 1436

Egor
12.04.2017
06:27:58
я имею в виду саму операцию нужно один раз сделать над таблицей или она будет повторяться через время?

Super
12.04.2017
06:28:12
Один раз

Egor
12.04.2017
06:28:44
тогда напиши простой скрипт и всё

Super
12.04.2017
06:54:50
те это можно сделать динамически не меня дату?

Subb98
12.04.2017
06:55:51
Напиши лучше, что ты хочешь сделать. Где тебе нужны эти данные в конечном итоге, где ты будешь их использовать.
Если на веб-странице, например, то нет никакого смысла обновлять данные в самих записях, тебе нужен скрипт.

Super
12.04.2017
06:59:52
Все оказалось намного проще чем я думал
SELECT
*, (SELECT SUM(count) FROM tmp_res WHERE bdate <= t.bdate)
FROM
tmp_res as t;

Fike
12.04.2017
09:43:43

Nikolay
12.04.2017
19:21:12
select user_models.*,
count(user_id) as count_messages
from chat_logs
left join user_models on user_models.id = user_id
where chat_id = 2
group by user_id
order by count_messages desc
Как такое чудо можно оптимизировать? Запрос считает кол-во сообщений юзера в чате. Профайлер говорит что самая затратная операция "Copying to tmp table"
Проблема по всей видимости в count и group by
Explain запроса

Google

Yura
12.04.2017
19:26:50
Если есть возможность, то лучше такое хранить в доп колонке в юзерах, т.е. сразу аггрегированное знажение.
При росте базы все равно придется так делать.
Хотя зависит от объема
Для начала - индексы в порядке?

Fike
12.04.2017
19:28:36
джойнить-то зачем

Yura
12.04.2017
19:29:12
Видно, что тянется инфа из юзеров

Fike
12.04.2017
19:29:23
ну и здесь-то зачем ее тянуть
давайте сделаем громадную промежуточную таблицу, а потом начнем ее фильтровать и считать

Nikolay
12.04.2017
19:29:40

Yura
12.04.2017
19:29:47
Скорее всего для вывода
Юзер1: 1555
Юзер2: 1200
...

Fike
12.04.2017
19:30:04

Yura
12.04.2017
19:30:42

Fike
12.04.2017
19:30:51
имена трех с половиной калек легко возвращаются вторым запросом по конкретным айдишникам, не говоря уж о том, что изврат с подзапросом наверняка сделает все гораздо лучше и позволит джойнить с уже готовым результатом, а не со всей таблицей
ооо боги
кто-то еще апеллирует к сперва добейся

Nikolay
12.04.2017
19:31:10
Понятно, что лучше хранить количество сообщений в отдельном поле.