revered

Рейтинг
131
Регистрация
03.08.2012

Перенес базу на mysql 5.7

Заметил, что легкие запросы стали наоборот дольше отрабатывать, примерно в 2 раза. Но это не страшно, т.к. все равно очень быстро выполняются.

А вот сложные запросы - стали в 4 раза быстрее отрабатывать.

Спасибо за рекомендацию!

У меня много запросов:

SELECT * FROM table WHERE id IN (1,2,3.......9998,9999)

Если в IN несколько элементов - то отрабатывает мгновенно.

Если в IN несколько сотен элементов то 0.1-0.2 сек. запрос выполняется.

Если в IN несколько тысяч элементов то до 20 сек. запрос выполняется.

Поиск идет по PRIMARY id.

Я так понимаю, что это можно ускорить настройкой сервера, просто не хватает знаний как правильно настроить.

Все таки решил поставить memcache, чтобы ускорить работу. При нескольких запросах в секунду сервер начинает ложиться :(

Но проблема в том, что не ставится мемкеш. Помогите, как понять, где ошибка?

$memcache->connect('127.0.0.1', 11211) or die ("Could not connect");

Выдает

Could not connect

В ISP maneger включил memcache.

phpinfo();

Выдает: https://yadi.sk/i/fwXkSwiO3MzxPw

Подскажите, куда копать?

danforth:
Кешируйте веб-сервером, зачем вам постоянно лазить в базу за одними и теми же данными? А при добавлении новой организации чистите кеш. Скорость отдачи будет как у статики, собственно это и есть статика.

На сайте более 20 000 000 страниц, исходя из этого на одну и ту же страницу пользователь будет попадать не так часто. А вот сбивать кеш придется достаточно часто, т.к. данные постоянно добавляться буду в базу.

Согласен, что кеш все равно ускорит. Но тем не менее, каждый новый заход пользователя (после сбивания кеша) будет все равно грузить базу, по этому и хотелось реализовать без кеширования на стороне ВЕБ сервера.

edka:
А диск стоит SSD ?

Совершенно верно, SSD.

Что сделал в итоге:

1. Усилил сервер: купил больше оперативки и увеличил количество процессоров.

2. Перешел на PHP 7.1

3. Сервер базы остался прошлой версии, не получилось пока перейти на новую версию.

4. Все таблицы из innoDB перевел в MYISAM.

5. Немного изменил архетиктуру БД. В таблице где выбирал ID организаций по категории - добавил ещё id города.

Теперь запрос выглядит так:

SELECT organization_id FROM `organization_category` WHERE category_id=90 AND city_id=518

Благодаря такому запросу теперь выборка не по 100 000 записей идет, а в большинстве случаев до 5 000 записей.

После увлечения процессоров и обновления до PHP 7.1 сам скрипт (не считая запросы в БД) стал работать до 100 раз быстрее.

Ну и после добавления города в запрос и перевода таблиц в другой движок - БД тоже стала работать намного быстрее.

Как итог: теперь практически все страницы открываются быстро. До 0.2 сек.

Конечно хотелось бы ещё быстрее, т.к. Google Page Speed иногда ругается, что слишком долгий ответ от сервера.

+ осталась проблема с некоторыми категориями в городе Москва. Там при выборке id организаций не до 5000 записей, а около 50 000 записей, такие страницы грузятся 1-3 сек.

Но пока так оставлю. Спасибо всем за советы.

Версия сервера: 5.5.52-MariaDB - MariaDB Server

Версия протокола: 10

Версия PHP: 5.4.16

InnoDB - тип всех таблиц

Попробовал разделить запросы и произвести настройку сервера (параметры mysql).

Сейчас стало намного быстрее, но все равно 1-5 секунды загружается страница, что очень долго.

Вот например если взять такой запрос:

SELECT organization_id FROM `organization_category` WHERE category_id=90

Он бывает выполняется 1 секунду и делает выборку = 100 000 записей из 18 000 000.

При этом индекс category_id стоит.

Ещё, что интересно. Когда выполняю такой запрос в PHPmyadmin - выдает время на выполнение 0.05 секунд примерно.

А когда выполняю в PHP - первый раз выдает 0.5-1 сек, а потом когда берет с кеша уже уже менее 0.05 сек.

В PHP считаю время так:

$start = microtime(TRUE);
$res = mysqli_query($this->conn, $query);
$timer = microtime(TRUE) - $start;

И вот замечаю, что когда в phpmyadmin выполняю запрос: страница вроде грузиться долго, около 1 сек, а потом выдает что запрос выполнен за 0.05 сек.

Ребят спасибо за помощь.

Может кому пригодится. В итоге сработал такой вариант:

$conn = $app->entityManager->getConnection();

$users = $conn->fetchAll('SELECT * FROM users'); // Например, если нужно делать выборку

Спасибо за ответ. Но все равно не могу разобраться. Не могу подключить DBAL.

Кто хорошо знает symfony - напишите, пожалуйста, в личку.

Помогите за деньги. Буду очень рад.

Знающему человеку тут делов на 20-30 минут, я так полагаю.

Всем спасибо за ответы! Буду изучать)

Спасибо за помощь!

Всего: 350