<rmcreative>

RSS

Все заметки с тегом «MySQL»

Можно уточнить:

    (1)
    (1)
    (1)
    (3)
  1. (1)
    (1)
  1. (1)
    (3)
  1. (1)
  2. (2)
  3. (1)
  4. (1)
  5. (2)
  1. История одной оптимизации

    2 октября 2021

    Было: Каталог товаров с фасетами и хитрой сортировкой на MySQL.

    A: Переписали на SphinxSearch. После деплоя упёрлись в max_matches.

    B: Быстро повысили max_matches, но слишком сильно.

    C: Вернули max_matches в допустимые границы.

    Стало: Ответ сверера в два раза быстрее. Уменьшилась общая загрузка CPU и потребление памяти сервера.

    6 комментариев
  2. wnmp-dev 1.1.0

    16 декабря 2015

    Обновил набор для PHP-разработки под Windows. Удалось найти нормальный менеджер процессов без зависимостей и закрыть им проблему параллельной обработки нескольких скриптов.

    Написал его Пичулин Дмитрий уже давно, но выложил в OpenSource недавно. Утилита проверена им в продакшне. Менеджер стартует заданное количество php-cgi на одном порту. В случае умирания одного из php-cgi стартует новый. Кода там очень мало и им, кстати, заинтересовались в команде PHP for Windows. Надеюсь, PHP научится так делать из коробки.

    Кроме этого, поправил конфиги nginx и немного причесал батники.

    https://github.com/samdark/wnmp-dev

    9 комментариев
  3. wnmp-dev: nginx, MariaDB, PHP под Windows

    16 июля 2014

    Решил выложить то, что собрал себе вместо denwer для работы с PHP под Windows. Нынче популярны всякие Vagrant, но иногда, особенно если пишется кросс-платформенное решение вроде Yii, нужен и Windows в том числе.

    Итак, wnmp-dev — простейший набор bat-скриптов и конфиг для nginx, которые позволяют развернуть полноценный вебсервер под Windows и легко переключаться между разными версиями PHP.

    Как поставить:

    1. Клонируем https://github.com/samdark/wnmp-dev.git или загружаем архивом.
    2. Забираем нужные версии PHP с сайта PHP for Windows. Берите nts, x86 zip.
    3. Распаковываем архив. Версия 5.5 должна оказаться в php55, версия 5.4 в php54.
    4. Забираем MariaDB или MySQL, складываем в mariadb.
    5. Копируем nginx/conf/vhosts/example._conf в nginx/conf/vhosts/mysite.conf, редактируем так, чтобы конфиг указывал на ваш вебрут.
    6. Добавляем домен из конфига в hosts.
    7. Запускаем start_all.bat
    8. Работаем.

    Предложения, пожелания и вопросы принимаются, ридми будет уточняться.

    https://github.com/samdark/wnmp-dev

    17 комментариев
  4. MySQL, REPLACE INTO и ON DUPLICATE KEY UPDATE

    23 декабря 2012

    В MySQL есть два расширения, которые позволяют атомарно вставить или обновить запись. Годятся они для штук с довольно высокой нагрузкой, когда без блокировок не работает типичный сценарий:

    1. Выбрать запись.
    2. Если выбралась — обновить.
    3. Если пусто — вставить.

    REPLACE

    REPLACE INTO
      vote
    SET
      user_id = 13,
      object_id = 42,
      value = 7

    INSERT INTO ON DUPLICATE KEY UPDATE

    INSERT INTO
      vote
    SET
      user_id = 13,
      object_id = 42,
      value = 7
    ON DUPLICATE KEY UPDATE
      value = 7

    Сходства

    И то и то выражение в итоге даст примерно тот же результат. При нарушении ограничения на уникальность (то есть UNIQUE KEY или PRIMARY KEY) не будет никакой ошибки. Для ключа user_id, object_id в базе будет единственная запись с значением 7.

    Отличия

    Кроме очевидного отличия в синтаксисе есть и очень важно отличие в том, как всё это работает. REPLACE при срабатывании ограничения удаляет запись (и вызывает ON DELETE CASCADE) и затем вставляет новую, что не так быстро, как ON DUPLICATE KEY UPDATE, который обновляет запись без удаления.

    12 комментариев
  5. MySQL, длина int

    24 сентября 2012

    Провёл опрос знакомых разработчиков. По результатам выяснилось, что документация MySQL совсем не помогает понять, что же такое N в типе данных int(N).

    Если вы думаете, что это размер хранимых данных в байтах или символах, то это не так. В int(1) запросто можно записать 2147483647.

    Если вы думаете, что это максимальное количество символов, которое база вам покажет при SELECT, то это, опять же, не совсем так.

    CREATE TABLE `test` (
      `number` int(3) DEFAULT NULL,
      `zerofill_number` int(3) unsigned zerofill DEFAULT NULL
    );
     
    INSERT INTO test (number, zerofill_number) VALUES (123456789, 123456789), (1, 1);
     
    SELECT * FROM test;

    На выходе получим:

    number    | zerofill_number
    --------------------------- 
    123456789 | 123456789
            1 |       001
    

    То есть в случае int(3) DEFAULT NULL у нас (3) вообще ни на что не повлиял (разве что MySQL будет материться на непонятном языке при попытке добавить FK, где с другой стороны, например, int(11)).

    В случае же int(3) unsigned zerofill DEFAULT NULL получаем аналог PHP-шного str_pad. То есть, если при преобразовании значения в строку эта самая строка короче N, то она добивается слева нулями до длины N.

    И в том и в другом случае размер данных никак не меняется.

    12 комментариев
  6. И ещё раз про невнятные ошибки MySQL

    18 апреля 2012

    Снова наткнулся на совсем-совсем невнятные ошибки MySQL. Всё больше убеждаюсь, что о людях при написании данной его части никто не думал.

    ALTER TABLE `post` DROP FOREIGN KEY `FK_Post_UserID`

    В результате получаем:

    SQLSTATE[HY000]: General error: 1025 Error on rename of './mydb/post' to './mydb/#sql2-11a-1f2c' (errno: 152)
    

    Очень помогло…

    Оказывается, нормальую информацию, получить всё-таки можно. Правда, через одно место:

    SHOW ENGINE INNODB STATUS

    отдаст нам кучу всего, в том числе:

    LATEST FOREIGN KEY ERROR
    ------------------------
    120418 16:58:22 Error IN dropping of a FOREIGN KEY CONSTRAINT of TABLE "mydb"."post",
    IN SQL command
    ALTER TABLE `post` DROP FOREIGN KEY `FK_Post_UserID`
    Cannot find a CONSTRAINT WITH the given id "FK_Post_UserID".
    

    Вот это уже намного понятней. У нас просто нет FK с таким именем. Интересно, чем руководствовались разработчики MySQL, скрывая от конечного пользователя действительно важную для него информацию?

    7 комментариев
  7. MySQL, найти в базе все таблицы с движком MyISAM или MARIA

    1 декабря 2011

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

    SELECT TABLE_NAME
    FROM information_schema.TABLES
    WHERE TABLE_SCHEMA='my_db_name'
    AND TABLE_TYPE='BASE TABLE'
    AND ENGINE IN ('MARIA','MyISAM')
    Комментировать
  8. Сколько памяти скушает MySQL

    23 ноября 2011

    Скармливаем формочке свой конфиг, получаем вполне конкретные цифры в пике.

    Пользуемся

    Считается так:

    // столько кушаем на коннект:
    (max_allowed_packet + sort_buffer_size + net_buffer_length + thread_stack + read_rnd_buffer_size + read_buffer_size + join_buffer_size)
    // умножаем на макс. кол-во коннектов
    * max_connections
    // а столько выделяем вне зависимости от количества коннектов:
    + innodb_log_buffer_size +
    query_cache_size + innodb_buffer_pool_size + innodb_additional_mem_pool_size + key_buffer_size
    Комментировать
  9. Сообщения об ошибках и хороший код

    17 апреля 2011

    Как ни странно, очень многие разработчики пренебрегают более строгими режимами работы тех же PHP и MySQL. Странно это, прежде всего, потому, что включение таких режимов позволяет получать больше информации о потенциальных ошибках в коде и, соответственно писать код лучше.

    В PHP самый строгий уровень ошибок можно получить записав в php.ini:

    error_reporting  =  -1
    

    Это позволяет выявить такие слабые места, как, например, использование переменных без их объявления. Да и банальные описки выявляются сразу, а не после пары часов жёсткого дебага.

    В MySQL тоже есть строгий режим, который не позволяет, например, вставить строку длиной в 200 символов в поле varchar(20). В «умолчательном» режиме MySQL молча вставит первые 20 символов, выкинув остальные. В строгом — получим соответствующую ошибку. Включается этот режим через my.cnf:

    [mysqld]
    sql-mode = "STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE"
    

    Все значения sql-mode можно подсмотреть в официальной документации.

    22 комментария
  10. MySQL 5.5

    16 декабря 2010

    Oracle релизнули стабильную MySQL 5.5.

    Про изменения хорошо написано на OpenNews. Отдельно можно отметить:

    • Более, чем в два раза увеличенная производительность по сравнению с 5.1.
    • Новый эффективный оптимизатор JOIN-ов и вложенных запросов.
    • InnoDB теперь используется по умолчанию.
    • Значительные улучшения масштабируемости.

    • Список изменений на английском

    • Обновляемся и пробуем
    Комментировать