[MySQL] MySQL отвечает на вопросы

 содержание

1. Каковы уровни изоляции транзакций MySQL? Какие проблемы они решают?

2. Как реализовать повторяющееся чтение MySQL?

3. Как устранить проблему полных соединений mysql?

4. В чем разница между MyISAM и InnoDB в Mysql?


1. Каковы уровни изоляции транзакций MySQL? Какие проблемы они решают?

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

  • Грязное чтение: транзакция считывает данные, которые еще не были зафиксированы другой транзакцией.
  • Неповторяющееся чтение: когда одни и те же данные считываются несколько раз в транзакции, результаты будут противоречивыми.
  • Фантомное чтение: используйте один и тот же SQL для чтения дважды в транзакции, а новая строка, вставленная другой транзакцией, читается второй раз.

Неповторяющееся чтение фокусируется на модификации данных, а фантомное чтение - на вставке данных.

Уровень изоляции

Грязное чтение

Неповторимый

Призрачное чтение

Читать незафиксированные

Иметь

Иметь

Иметь

Прочитано совершено

нет

Иметь

Иметь

Повторяющееся чтение

нет

нет

Иметь

Сериализуемый

нет

нет

нет

2. Как реализовать повторяющееся чтение MySQL?

Реализовано с использованием MVCC, а именно управления параллелизмом Mutil-Version, управления параллелизмом нескольких версий. Что касается MVCC, наиболее распространенными являются следующие утверждения, включая введение «High Performance MySQL».

InnoDB сохраняет две скрытые столбцы позади каждой строки записей, которые , соответственно , сохранять созданный номер версии и удаленный номер версии строки данных . Каждый раз, когда запускается новая транзакция, номер версии системы увеличивается. Номер версии в начале транзакции будет использоваться как номер версии транзакции, который будет сравниваться с номером версии каждой строки запроса. Как MVCC работает на уровне повторяемого чтения:

  • ВЫБРАТЬ: Следующие два условия должны быть выполнены одновременно, чтобы иметь возможность делать запросы. 1) Проверять только те строки данных, номер версии которых более ранний, чем текущая версия; 2) Удаленная версия строки либо не определена, либо больше номера версии текущей транзакции.
  • ВСТАВИТЬ: сохранить номер текущей версии системы как номер версии создания для каждой вставленной строки.
  • УДАЛИТЬ: сохранить номер текущей версии системы в качестве номера версии для удаления для каждой удаленной строки.
  • ОБНОВЛЕНИЕ: вставьте новый фрагмент данных и сохраните текущий номер версии системы в качестве номера созданной версии. В то же время сохраните текущий номер версии системы как исходную строку данных и удалите номер версии.

MVCC работает только на уровнях RC (Read Committed) и RR (Repeatable Read), потому что RU (Read Uncommitted) всегда считывает последнюю версию данных, а не строку данных, которая соответствует текущей версии транзакции. И Serializable заблокирует все прочитанные строки. Ни один из этих уровней не требует помощи MVCC.

Сначала я тоже верил в это утверждение, но позже я обнаружил, что это утверждение на самом деле немного проблематично в определенных сценариях.

Для простого примера: если поток 1 и поток 2 начали транзакцию последовательно, номер версии транзакции - 1 и 2. Если поток 1 еще не зафиксировал транзакцию, когда поток 2 запускает транзакцию, то в это время выполняется транзакция потока 2. Вы не должны видеть содержимое модификации транзакции потока 1.

Но если вы следуете приведенному выше утверждению, поскольку версия транзакции потока 1 является более ранней, чем версия транзакции потока 2, транзакция потока 2 может видеть содержимое модификации транзакции потока 1.

3. Как устранить проблему полных соединений mysql?

    å¦ä½å¿ «éå¤çmysqlè¿æ ¥ æ ° å æ» ¡çé®é ¢ ï¼

Аномальное соединение с базой данных

3.1 Сначала подключитесь к серверу mysql удаленно

mysql -h ip -u root -p -P 3306

例如:mysql -h ××.××..××..××. -P 3306 -u xx-p

-h指定远程 ip地址 -P指定端口号 -u 指定用户名 -p 指定密码

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

3.2 Запрос количества доступных подключений и максимального количества подключений и обнаружение, что количество подключений заполнено

Как быстро решить проблему полных соединений mysql?

Использование подключения

3.3 Запросить 10 самых продолжительных времени выполнения SQL

Select * from information_schema.processlist where info is not null order by time desc limit 10 ;

Было обнаружено, что один и тот же sql занимает большое количество подключений mysql, что приводит к переполнению количества подключений mysql. Расследование запускается службой массовой отправки. Во-первых, заблокируйте функцию массовой отправки, повторно выпустите версию и перезапустите обслуживание.

3.4 Создание сценария процесса уничтожения с помощью команды

`select concat('KILL',id,';') from information_schema.processlist where user='root' into outfile '/var/lib/mysql-files/a.txt';`

或者增加时间条件

`select concat('KILL',id,';') from information_schema.processlist where user='root' and time>100 into outfile '/var/lib/mysql-files/aa.txt'; `

3.5. Запустите скрипт, чтобы уничтожить соединения.

source /var/lib/mysql-files/a.txt

3.6. Статус выполнения потока запросов

show status like 'Threads%'

После пакетного уничтожения отрегулируйте количество подключений, служба работает нормально;

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

Статьи по Теме

  1. Как быстро решить проблему полных соединений mysql?

4. В чем разница между MyISAM и InnoDB в Mysql?

 

Обзор движка Innodb

Механизм Innodb обеспечивает поддержку транзакций ACID базы данных и реализует четыре уровня изоляции стандарта SQL. Механизм также обеспечивает блокировки на уровне строк и ограничения внешнего ключа. Его цель разработки - обработка систем баз данных большой емкости. Сама по себе система фактически представляет собой полную систему баз данных на основе MySQL. Когда MySQL работает, Innodb создаст пул буферов. в памяти для данных буфера и индекса. Но движок не поддерживает индексы типа FULLTEXT и не сохраняет количество строк в таблице.При выборе SELECT COUNT (*) FROM TABLE ему необходимо просканировать всю таблицу. Когда вам нужно использовать транзакции базы данных, этот механизм, конечно, является первым выбором. Поскольку степень детализации блокировки меньше, операция записи не будет блокировать всю таблицу, поэтому при высоком уровне параллелизма использование механизма Innodb повысит эффективность. Однако использование блокировок на уровне строк не является абсолютным.Если MySQL не может определить диапазон для сканирования при выполнении оператора SQL, таблица InnoDB также заблокирует всю таблицу.

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

Обзор движка MyISAM

В MySQL 5.1 и более ранних версиях MyISAM является механизмом по умолчанию. MyISAM предоставляет большое количество функций, включая полнотекстовое индексирование, сжатие, пространственные функции (GIS) и т. Д., Но MyISAM не поддерживает транзакции и блокировки на уровне строк, и нет сомнений в том, что его нельзя безопасно восстановить после авария . MyISAM является механизмом MySQL по умолчанию, но он не поддерживает транзакции базы данных, а также не поддерживает блокировки на уровне строк и внешние ключи. Поэтому, когда данные INSERT (вставка) или UPDATE (обновление), операции записи должны блокировать вся таблица, что дееспособно будет ниже. Однако, в отличие от Innodb, MyISAM хранит количество строк в таблице, поэтому при SELECT COUNT (*) FROM TABLE вам нужно только напрямую прочитать сохраненные значения без выполнения полного сканирования таблицы. Если таблица имеет больше операций чтения, чем операций записи, и не требует поддержки транзакций базы данных, MyISAM также является хорошим выбором.

разница:

  1. InnoDB поддерживает транзакции ACID, MyISAM не поддерживает транзакции. Это одна из важных причин, почему MySQL изменил механизм хранения по умолчанию с MyISAM на InnoDB; безопасный для транзакций (совместимый с ACID) с возможностями фиксации, отката и восстановления после сбоя Таблица типов .
  2. InnoDB поддерживает внешние ключи, а MyISAM - нет. Преобразование таблицы InnoDB, содержащей внешние ключи, в MYISAM не удастся;
  3. InnoDB - это кластеризованный индекс, MyISAM - это некластеризованный индекс. Файлы кластеризованного индекса хранятся на конечных узлах индекса первичного ключа, поэтому InnoDB должен иметь первичный ключ, а эффективность индекса первичного ключа очень высока. Однако для вторичного индекса требуется два запроса: сначала запрашивается первичный ключ, а затем данные запрашиваются через первичный ключ. Следовательно, первичный ключ не должен быть слишком большим, потому что первичный ключ слишком велик, и другие индексы также будут большими. MyISAM - это некластеризованный индекс, файл данных разделен, а индекс сохраняет указатель файла данных. Индекс первичного ключа и вторичный индекс независимы.
  4. InnoDB не сохраняет определенное количество строк в таблице, и при выполнении select count (*) from table требуется полное сканирование таблицы. MyISAM сохраняет количество строк всей таблицы с переменной, и ей нужно только прочитать переменную при выполнении вышеуказанного оператора, что очень быстро;
  5. Наименьшая степень детализации блокировки InnoDB - это блокировки строк, а наименьшая степень детализации блокировки MyISAM - это блокировки таблиц. Оператор обновления блокирует всю таблицу, вызывая блокировку других запросов и обновлений, поэтому одновременный доступ ограничен. Это также одна из важных причин, почему MySQL изменил механизм хранения по умолчанию с MyISAM на InnoDB;
  6.  

как выбрать:

  1. Если вы хотите поддерживать транзакции, если хотите, выберите InnoDB, если вам не нужно рассматривать MyISAM;
  2. Если большинство таблиц представляют собой только запросы на чтение, вы можете рассмотреть MyISAM. Если и чтение, и запись происходят часто, используйте InnoDB.
  3. После сбоя системы MyISAM будет сложнее восстановить.Если это приемлемо или нет, выберите InnoDB;
  4. Начиная с MySQL5.5, Innodb стал механизмом по умолчанию для Mysql (ранее MyISAM), что указывает на то, что его преимущества очевидны для всех. Если вы не знаете, какой механизм хранения использовать, используйте InnoDB, по крайней мере, неплохо.

 Статьи по Теме

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

рекомендация

отblog.csdn.net/qq_41893274/article/details/113791037
рекомендация