- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Все что нужно знать о DDоS-атаках грамотному менеджеру
И как реагировать на "пожар", когда неизвестно, где хранятся "огнетушители
Антон Никонов
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Приветствую!
Пишу на форум так как поисковики мне не помогли. Имеем табличку 25мб с 500к строк, и SQL запрос:
SELECT SQL_NO_CACHE count(*) FROM table WHERE user_name="admin" GROUP BY user_id
Так вот, если выполнять его через phpMyadmin или через свой скрипт с mysqli_query, то время выполнения почти 2 секунды, а если выполнять в консоли через клиент базы mysql, то время 0.1сек. Вопрос не в том как улучшить этот запрос, а в том - почему через PHP этот запрос выполняется долго. Пробовал разные версии php 7.0, 5.6, 5.3, а также разные версии MariaDB 10.0 / 10.1. Пробовал разные настройки и оптимизации в my.cnf, никаких улучшений. Однако если убрать часть условия, например это WHERE user_name="admin" или убрать это GROUP BY user_id, то выполнение через PHP становится таким же быстрым, 0.1 сек. Что за чертовщина, как вычислить причину? :(
У вас индексы проставлены в user_name и в user_id?
Также COUNT(*) в InnoDB всегда выполняется долговато.
---------- Добавлено 17.04.2018 в 16:02 ----------
Также зачем вам SQL_NO_CACHE? Чисто для теста? В реальности, пусть закеширует и всё.
Таблица myisam, индекс есть только на user_id, и это не моя таблица, а из одной CMS, т.е. да, можно придумать более оптимизированный запрос, но мой вопрос именно в том, почему тормозит только через PHP. Напрямую через mysql клиент запрос выполняется очень быстро.
Таблица myisam, индекс есть только на user_id, и это не моя таблица, а из одной CMS, т.е. да, можно придумать более оптимизированный запрос, но мой вопрос именно в том, почему тормозит только через PHP. Напрямую через mysql клиент запрос выполняется очень быстро.
Ничего у вас быстро не выполняется. Вы не учитываете накладные расходы.
Если у вас myisam, тогда у вас проблема в индексах.
user_name обязательно установите индекс и скорость возрастёт в разы.
---------- Добавлено 17.04.2018 в 16:13 ----------
Также смотрите параметры:
max_heap_table_size - Used with GROUP BY
sort_buffer Used with - ORDER BY and GROUP BY
Параметры эти увеличивал, хоть 1гб выставляй, на время не влияет.
Вот в консоли результат запроса вылетает мгновенно, и это точно не кеш, переменные разные пробовал:
+----------+
| count(*) |
+----------+
| 2 |
+----------+
1 row in set (0.11 sec)
Тоже самое в phpMyAdmin:
SELECT SQL_NO_CACHE count(*) AS cnt FROM voc_quiz_top WHERE user_name="admin" GROUP BY user_id
Ещё раз повторюсь, это не мой сайт, а клиентский и оптимизировать SQL я не могу.
Больше похоже на проблему PHP + MariaDB, давно на MySQL с debian 8 таких проблем не замечали. Почему и пишу в администрирование.
Сейчас: Server version: 10.1.26-MariaDB-0+deb9u1 Debian 9.1
Включите в phpMyAdmin профилирование запросов, там будет видно, какая стадия запроса выполняется долго.
Включите в phpMyAdmin профилирование запросов, там будет видно, какая стадия запроса выполняется долго.
А какая разница, если ничего менять нельзя в структуре?
Приветствую!
Пишу на форум так как поисковики мне не помогли. Имеем табличку 25мб с 500к строк, и SQL запрос:
SELECT SQL_NO_CACHE count(*) FROM table WHERE user_name="admin" GROUP BY user_id
Так вот, если выполнять его через phpMyadmin или через свой скрипт с mysqli_query, то время выполнения почти 2 секунды, а если выполнять в консоли через клиент базы mysql, то время 0.1сек. Вопрос не в том как улучшить этот запрос, а в том - почему через PHP этот запрос выполняется долго. Пробовал разные версии php 7.0, 5.6, 5.3, а также разные версии MariaDB 10.0 / 10.1. Пробовал разные настройки и оптимизации в my.cnf, никаких улучшений. Однако если убрать часть условия, например это WHERE user_name="admin" или убрать это GROUP BY user_id, то выполнение через PHP становится таким же быстрым, 0.1 сек. Что за чертовщина, как вычислить причину? :(
А коннект к базе у Вас в обоих случаях одинаковый?
Если в одном случае сокеты, а в другом случае ИП, то разница может упираться именно в это.
Профилирование показало задержку только в этом:
Array
(
[Status] => Sending data
[Duration] => 1.736824
)
Да, на сайтах как обычно идёт подключение через localhost.
Однако пока не понятно, если возвращаемый результат должен быть всего лишь 1 число, то почему так долго, ощущение что он передаёт всю эту таблицу на 25мб с 500к строк. 😒
\
Он её всю перебирает из-за того что нет индекса на поле.
Да, на сайтах как обычно идёт подключение через localhost.
Именно через localhost, а не через 127.0.0.1
Просто кроме как способом коннекта разницу в скорости одного и того же запроса из разных клиентов объяснить затруднительно.
Еще вариант, может тестовую базу данных создали и позабыли 😂 не, ну а че, бывает. Со скрипта коннектитесь к одной, с консоли к другой.
Можно рассуждать про отсутствие индексов, но вопрос о том почему они вдруг появляются при запросе из консоли работают, а при работе с сайта нет - вряд ли будет отвечен.