За последние 24 часа нас посетили 17760 программистов и 1621 робот. Сейчас ищут 1815 программистов ...

Блокировка базы на хостинге. КАК РАБОТАЕТ MySQL ?

Тема в разделе "MySQL", создана пользователем DAGDOG, 26 ноя 2016.

  1. DAGDOG

    DAGDOG Новичок

    С нами с:
    22 ноя 2016
    Сообщения:
    18
    Симпатии:
    0
    Доброго времени суток дамы и господа!
    Есть база на 500 000 строк. Сайт работал работал 1.5 года. Буквально несколько дней назад хостинг заблокировал базу. Обратившись в службу поддержки - обвинили в незнании MySQL и обосновали блокировку так.

    Цитирую:
    База создает огромные временные файлы, которые мешают работе сервера.
    Размер фала не меньше 2 гб . Запрос, скорее всего:


    PHP:
    1. SELECT * FROM `page` WHERE id = '61' GROUP BY `id_single` ORDER BY `id` DESC LIMIT 7
    ВОПРОС:

    КАК РАБОТАЕТ MySQL ?
    MySQL Выбирает строки по критериям??? Или реально по каким то причинам может создавать огромные временные файлы, считывая все строки?
     
  2. DAGDOG

    DAGDOG Новичок

    С нами с:
    22 ноя 2016
    Сообщения:
    18
    Симпатии:
    0
    SELECT * FROM `page` WHERE id_cat = '61' GROUP BY `id_single` ORDER BY `id` DESC LIMIT 7
    Вот такой запрос ...
     
  3. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Бесплатный шаред хостинг чтоли?

    Каков размер базы? Как проставлены индексы? Сколько полей в таблице, из которой идет выборка?
     
  4. DAGDOG

    DAGDOG Новичок

    С нами с:
    22 ноя 2016
    Сообщения:
    18
    Симпатии:
    0
    Хостинг VDS - Проплаченный по макс
    - Размер базы 402 мб; "Отдельная база с 1 таблицей"
    - Кол-во полей 25; "В полях только цифровые значения"
    Про индексы не понял. Но так скажу. Все записи в одной таблице. У каждой записи id - По категории, внутренней категории, стране, и т.д. т.е. выборка идет по id записи - 7 записей по запросу. И по id параметров создаются. доп запросы.
    Вопрос в другом. Тех. поддержка утверждает, что любые запросы в "MySQL" - Генерят сначала ВСЕ ЗАПИСИ, а потом из переменной вытаскивают нужные по параметрам - Это так ??? от куда может взяться 2 гб памяти на 1 запрос? Они балаболы ?

    Или такой запрос не нужен вообще ???
     
    #4 DAGDOG, 26 ноя 2016
    Последнее редактирование: 26 ноя 2016
  5. DAGDOG

    DAGDOG Новичок

    С нами с:
    22 ноя 2016
    Сообщения:
    18
    Симпатии:
    0
    Модер? В чем косяк ? Тупо из-за виртуального хостинга, что ли??? У меня реально депресняк ...
     
  6. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Боюсь, что да. Limit не означает "база, выбирай мне тут данные, а как 7 насчитаешь, стой". Иначе бы группировка и сортировка работали некорректно. Дело в том, что сначала ты выбираешь из этих 402 мегабайт все строки с указанным id, именно вот все, потом все их группируешь, потом все их сортируешь, и только потом просишь базу взять первые 7 результатов из того, что получилось, а остальное отбросить.
    --- Добавлено ---
    Зайди в PMA и посмотри explain, должна там быть для этой функции отдельная менюшка, кнопка, не помню что там. Там может быть написано, как решить твои проблемы.
    --- Добавлено ---
    А так, потенциальных решений много может быть.
    Чисто вот из интереса, сколько строк приходится на один id? Судя по размеру таблицы, у тебя там многие тысячи их. Может быть, стоит как-то оптимизировать структуру данных?
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    индексы нужны, и про нулл тоже почитать стоит до того, как других учить.

    У тебя запрос подразумевающий много всяких операций прежде, чем удастся сделать искомый ответ. Он потребляет много памяти. Вот тебя и ругают.
     
  8. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Предлагаю не делать межтопиковые беседы. Со стороны смотрится странно и непонятно может быть, кому адресовано. Нуллы пусть будут в топике с нуллами, уверен, автор и его просматривает.
     
  9. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я просто удивился, когда тут увидел уровень понимания.
     
  10. DAGDOG

    DAGDOG Новичок

    С нами с:
    22 ноя 2016
    Сообщения:
    18
    Симпатии:
    0
    Я самоучка. Этой мой первый форум, где я задал вопрос. Что значит индексы ? И тема с NULL тоже связана.
    Так как я использую NULL в базе.
    Вопрос другой. Зачем такой запрос вообще существует и на всех форумах и учебниках пишут именно так ...

    PHP:
    1. SELECT * FROM `page` WHERE id_cat = '61' GROUP BY `id_single` ORDER BY `id` DESC LIMIT 7
    Может даже и не нужно выбирать все поля. а сделать выборку по id.

    Этот запрос везде советуют. Зачем ? Если он неправильный...
    Оптимизация базы - понятно.
    Получается, что MySQL не выбирает из конкретной ячейки. База собирается целиком при таком запросе.
    Получается, что русские программисты заранее направлены на ложный путь. Правильно, нет ?
     
  11. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Что значит неправильный? Он работает? Да. Проблема не в запросе. Проблема в некорректной организации БД. Не знаешь, что такое индексы? Ищи. даже на этом форуме полно инфы. Надо порыться, я где-то выкладывал прям подробные выкладки на эту тему, но, правда, на английском.
    Нет. Ты обратил внимание, что ты сначала делаешь вывод, а потом просишь подтвердить его верность и уже в последнюю очередь опровергнуть?
    --- Добавлено ---
    Во, лови https://php.ru/forum/threads/antipatterny-dlja-bd.59837/ там и на русском есть.
     
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну, это отдельное искусство оптимизации запросов. У всех задачи разные, и запросы оптимизируют, и даже структуру БД в зависимости от своих ситуаций каждый по-своему.

    А запрос универсальный. Он правильный. Запрос правильный, с ним всё в порядке. Просто возможно тебе нужно добавить индексы, потом подумать, можно ли как-то что-то ещё улучшить.

    Но перво-наперво стоит у себя на локалке поднять мускул и гонять запросы в него, и смотреть, что там он делает с ними. Если он делает фулскан, если он много делает временных таблиц, и жрёт кучу памяти - надо что-то крутить в структуре базы и в запросах.

    это как содержание в книге. позволяет формировать выборку не тормоша данные, а только используя индексы.
     
  13. DAGDOG

    DAGDOG Новичок

    С нами с:
    22 ноя 2016
    Сообщения:
    18
    Симпатии:
    0
    Заблокирован сайт - Удалите сообщение после просмотра...
     
  14. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Что значит заблокирован? Это ссылка внутри форума. Или заблокированы ссылки что там в постах? Не должны. У меня все нормально работает. Там никаких запрещенных данных нет. Или ты не из России и у тебя другие блокировки? Ну так воспользуся анонимайзером каким-нибудь. Тысячи их. Фригейт поставь в браузер.
    --- Добавлено ---
    Впредь - если есть какие-то проблемы касательно форума, то либо стучись в личку, либо оставляй жалобу на нужное сообщение. Даже если это сообщение модератора. Пилишь жалобу, описываешь в ней проблему, мол "ссылки не открываются". А там уже будем решать, что к чему. Жалобная кнопка - не инструмент наказания автора сообщения, это инструмент привлечения внимания модеров к сообщению с указанием причины привлечения внимания.
     
  15. DAGDOG

    DAGDOG Новичок

    С нами с:
    22 ноя 2016
    Сообщения:
    18
    Симпатии:
    0
    Провайдер блочит. Я посмотрел через анонимайзер.
    Да, я понял, что такое индексы. У меня так все и сделано.
    Ну, есть пару вещей которые нужно изменить. В любом случае спасибо.
    Я понял главное.

    Цитирую: http://ruhighload.com/post/Работа+с+индексами+в+MySQL

    Итак, есть две проблемы при чтении данных:

    • Низкая скорость чтения файлов из-за расположения блоков в разных частях диска (фрагментация).
    • Большое количество операций сравнения для поиска нужных данных.
    Для таких проектов нужен отдельный сервер. А не общий виртуальный.
    Спасибо. Очень выручили...
     
  16. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    По два гига на запрос жрать никакой сервер не выдержит. А если из будет хотя бы пять в секунду? Нужно что-то менять.
     
  17. DAGDOG

    DAGDOG Новичок

    С нами с:
    22 ноя 2016
    Сообщения:
    18
    Симпатии:
    0
    Сервис 1.5 года работал. Никаких нагрузок не было. Какие 5 запросов в сек ??????? Здесь на сайте больше 400 роботов пауков лазиет ежедневно. Уже все понятно и так. Тема закрыта. Всем спасибо.
     
  18. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    какой ты агрессивный.
     
  19. DAGDOG

    DAGDOG Новичок

    С нами с:
    22 ноя 2016
    Сообщения:
    18
    Симпатии:
    0
    http://poleshuk.ru/indeksy-v-mysql/
    ЦИТИРУЮ:
    Андрей:
    05.03.2014 в 5:29 пп


    unique key- игнорирует значения равные NULL? Т.е. пустоту.


    А Primary Key не может быть пустотой и используется для уникальных значений допустим идентификаторов в таблицах это поле ID всегда уникально и всего чемуто равно


    В MySQL Уже есть все кнопочки для создания индекса. Четко подметил Fell-x27
    --- Добавлено ---
    Сразу 2 вопроса решились. Для таких баз нужны и индексы и значения NULL - Все отлично получилось ...
     
  20. DAGDOG

    DAGDOG Новичок

    С нами с:
    22 ноя 2016
    Сообщения:
    18
    Симпатии:
    0
    Команда CREATE INDEX в версиях MySQL до 3.22 не выполняет никаких действий. В версии 3.22 и более поздних CREATE INDEX соответствует команде ALTER TABLE в части создания индексов. See section 6.5.4 Синтаксис оператора ALTER TABLE.

    Следует отметить, что при использовании любой другой опции для ALTER TABLE кроме RENAME, MySQL всегда будет создавать временную таблицу, даже если данные, строго говоря, и не нуждаются в копировании (например, при изменении имени столбца). Мы планируем исправить это в будущем, однако, поскольку ALTER TABLE выполняется не так часто, мы (разработчики MySQL) не считаем эту задачу первоочередной. Для таблиц MyISAM можно увеличить скорость воссоздания индексной части (что является наиболее медленной частью в процессе восстановления таблицы) путем установки переменной myisam_sort_buffer_size достаточно большого значения.

    ВЫВОД: Для таких проектов нужен свой сервер и своя настройка MySQL
     
  21. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    и структура бд, возможно что-то придётся денормализовать. Хотя, если у тебя как ты говоришь нагрузка небольшая, то да, можно тупо памятью решить.