MySQL — проблема запросов с limit и offset к очень большим таблицам и ее решение

Представим, что у нас есть таблица пользователей (users) или заказов (orders) на десятки миллионов записей и больше. И у нас стоит задача их перебора в любом контексте.

Я представляю себе это в виде цикла, в котором порционно забираем разумное количество записей, что-то вроде:

select * from users order by id limit 1000 offset 0;

Такой запрос выполняется очень быстро, моментально.

Рано или поздно мы приходим к offset, например 40 млн:

select * from users order by id limit 1000 offset 40000000;

И тут запрос может выполняться несколько минут.

Происходит это из-за того, что mysql не может гарантировать, что все элементы будут на своих порядковых местах, ведь может так статься, что элемент 40 000 099 был ранее удален и алгоритмам приходится сканировать все 40 млн элементов для получения выборки.

Решением этой проблемы может стать видоизменение запроса из limit-offset на where-limit:

 select * from users where id > 40000000 order by id limit 1000;

Выполняется моментально!

И даже, если не все элементы гарантированно присутствуют в таблице, айдишник для where легко «вытащить» из предыдущего запроса в цепочке.

Установка WordPress на CentOS7 c PHP7.2 и MySQL 8

Это последняя статья из серии «Устанавливаем блог WordPress на CentOS 7 с веб-сервером Caddy, PHP 7.2 и MySQL 8.0».

Ранее, для установки блога на вордпресс, мы уже сконфигурировали CentOS 7, установили майскл восьмой версии, пхп и кэдди в качестве быстрого, современного веб-сервера. Последний элемент — сам блог wordpress

Итак, на нашем сервере, переходим в директорию для веб-сайтов

$ cd /var/www

Скачиваем последнюю версию WordPress

$ sudo curl -O https://wordpress.org/latest.tar.gz

Распаковываем (архиватор распакует автоматически в директорию wordpress)

$ sudo tar zxf latest.tar.gz

Удаляем архив с файлами блога вордпресс (он нам больше не нужен)

$ sudo rm latest.tar.gz 

Устанавливаем права на директорию wordpress для caddy пользователя (ранее сконфигурированного при установке Caddy web-сервера)

$ sudo chown -R caddy:caddy wordpress

Теперь, подключим и настроим сайт нашего вордпресса

В данном примере, используем текстовый редактор nano, который мы ставили ранее (при конфигурировании операционной системы CentOS 7), однако вы можете использовать другой редактор, в том числе стандартный vi

Итак, открываем конфишурационный файл веб-сервера кедди

$ sudo nano /etc/caddy/Caddyfile

Копируем код ниже и вставляем его в файл конфигурации (при это необходимо заменить «example.com», в двух местах, доменом, который мы создавали в статье по выбору и приобретению простого и недорогого домена для вашего блога)

example.com {

    tls admin@example.com

    root /var/www/wordpress

    gzip

    fastcgi / 127.0.0.1:9000 php

    rewrite {

        if {path} not_match ^\/wp-admin

        to {path} {path}/ /index.php?_url={uri}

    }

}

Сохраняем (CTRL+O и ENTER для текстового редактора nano) и закрываем файл (CTRL+X).

Перезагружаем веб-сервер Caddy, чтобы применить новую конфигурацию

$ sudo systemctl restart caddy

Теперь наш блог должен открыться через браузер (пока что интерфейс для дальнейшего конфигурирования) — вводим в строке урл любого браузера наш домен (в моем случае это questpro.club), выбираем язык интерфейса (мне удобнее будет английский, но советую выбрать русский).

Жмем кнопку Let’s go

В предлагаемых полях на следующем экране вводим следующие данные (из этого мануала)

Database Name = wordpress

Username = wordpressuser

Password = gHspvn@36nBA

Database Host — оставляем значения по умолчанию

Table Prefix — оставляем значения по умолчанию.

Происходит инсталляция…

По ее завершении, вводим необходимые данные админа, для входа в админский аккаунт в вордпрессе. И далее пробуем заходить в админку с только что сгенерированными данными.

WordPress установлен

В следующей статье опишу процесс создания вашей собственной первой статьи и расскажу про популярный seo-плагин для начальной сео-оптимизации.

Установка PHP 7.2 на Centos 7 для WordPress

Это статья из серии «Устанавливаем блог WordPress на CentOS 7 с веб-сервером Caddy, PHP 7.2 и MySQL 8.0».

Для установки блога на WordPress мы уже сконфигурировали CentOS 7, установили майскл восьмой версии и кэдди в качестве быстрого, современного веб-сервера. Осталось поставить пхп с необходимыми плагинами.

На момент написании статьи CentOS 7 в стандартном репозитории имеет на борту php версии 5.4. И установить ее можно одной командой. Однако у меня было желание работать с более актуальной версией PHP (стабильной 7.2). В моем случае, необходимо заменить репозиторий (попутно установив утилиты для работы с репозиториями).

Последовательно выполняем команды ниже (может потребоваться ввод пароля от аккаунта операционной системы)

$ sudo yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
$ sudo yum install epel-release
$ sudo yum install yum-utils
$ sudo yum-config-manager --disable remi-php54
$ sudo yum-config-manager --enable remi-php72

И, вот тут то, устанавливаем PHP с необходимыми для блога плагинами

$ sudo yum -y install php-cli php-fpm php-mysql php-zip php-devel php-gd php-mcrypt php-mbstring php-curl php-xml php-pear php-bcmath

проверяем установленную версию

$ php -v

Вывод должен быть наподобие

PHP 7.2.30 (cli) (built: Apr 15 2020 07:23:04) ( NTS )

Copyright (c) 1997-2018 The PHP Group

Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

Теперь, слегка модифицируем конфигурационный файл, чтобы PHP сервис мог запускаться от имени пользователя веб-сервера caddy.

Будем использовать текстовый редактор nano, который мы ставили ранее (описано в статье), однако вы можете использовать другой редактор, в том числе стандартный vi. Итак

$ sudo nano /etc/php-fpm.d/www.conf

Ищем фрагмент с user =  и group =  

; Unix user/group of processes

; Note: The user is mandatory. If the group is not set, the default user's group

;       will be used.

; RPM: apache Choosed to be able to access some dir as httpd

user = apache

; RPM: Keep a group allowed to write in log dir.

group = apache

И меняем apache на caddy. Сохраняем (CTRL+O и ENTER для nano) и закрываем файл (CTRL+X).

Запускаем PHP сервис

$ sudo systemctl start php-fpm

Вуаля!

Установка MySQL 8 на CentOS 7 для WordPress

Это четвертая статья из серии «Устанавливаем блог WordPress на CentOS с Caddy, PHP 7.2 и MySQL 8.0». Вот мы, как раз, и приступаем к установке и настройке сервера базы данных MySQL 8 версии.

Скачиваем репозиторий с mysql сервером

$ sudo rpm -ivh https://repo.mysql.com/mysql80-community-release-el7-3.noarch.rpm

Cистема может запросить пароль для пользователя — вводим его (тот что сохранили при создании пользователя для системы CentOS 7)

Далее запускаем установку mysql сервера:

$ sudo yum install mysql-server

Будет вычислено необходимое место и запрошено подтверждения на установку — вводим y и ENTER.

По завершении установки сервера базы данных (сам процесс установки может занять от нескольких минут)

В завершении установки соглашаемся на подтверждение GPG-key — вводим y и ENTER.

После этого стартуем «майэскюэл» как сервис (скорее всего будет опять запрошен пароль для аккаунта)

$ sudo systemctl start mysqld

И проверяем статус работы сервиса

$ sudo systemctl status mysqld

В результате в выводе будет такая надпись Active: active (running), сигнализирующая что сервис работает.

При этом, вместе с установкой, mysql будет добавлен в автозагрузку и будет сгенерирован временный пароль для root пользователя, чтобы его просмотреть и сохранить введем команду

$ sudo grep 'temporary password' /var/log/mysqld.log

в конце строки вывода будет 12ти-значный набор символов, содержащий малые и большие буквы, цифры и как минимум 1 спец символ — это правила для пароля

Далее рекомендуется улучшить безопасность установленой версии базы данных с помощью встроенного скрипта:

$ sudo mysql_secure_installation

Вначале потребуется ввести временный пароль, а затем ввести новый пароль для установки его root пользователю и повторить ввод нового пароля — разумеется, сохраняем его себе — он нам точно понадобится далее.

Система запросит еще раз заметь пароль — отказываемся — No.

На все остальные следующие вопросы отвечаем да — Y: убираем доступ для анонимных пользователей, запрещаем доступ к базе извне для root, убираем тестовую базу данных, которая по умолчанию доступна всем и др.

MySQL установлен и сконфигурирован, давайте проверим работоспособность командой

$ mysqladmin -u root -p version

При вводе пароля к root пользователю базы данных — получаем в выводе некоторую информацию о сервере базы данных, включая его версию.

Далее, проведем начальную подготовку мускула (там mysql тоже называют 🙂 ) к установке WordPress…

Соединяемся с сервером базы данных под юзером root

$ mysql -u root -p

Вводим ранее сгенерированный (измененный и с сохраненный) пароль

Как только соединение будет установлено — создаем базу данных для WordPress (имя — wordpress)

mysql > CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

И пользователя с именем wordpressuser (и, например, с паролем gHspvn@36nBA) для доступа к этой базе данных

mysql> CREATE USER 'wordpressuser'@'localhost' IDENTIFIED WITH mysql_native_password BY 'gHspvn@36nBA';

Имеем ввиду, что пароль должен быть достаточно сложным, иначе увидим сообщение об ошибке (пароль: минимум 12 символов, должна быть заглавная буква, цифра и спец-символ).

Назначаем доступ пользователю wordpressuser к базе данных wordpress

mysql> GRANT ALL ON wordpress.* TO 'wordpressuser'@'localhost’;

Сообщаем mysql, что изменили привелегии (ни в кое случае нельзя забыть это)

mysql> FLUSH PRIVILEGES;

И безопасно закрываем соединение с базой данных

mysql> EXIT;

Далее можем приступить к установке Веб-сервера Caddy