Проверка и оптимизация производительности MySQL

Эта команда может видеть оператор SQL выполняется в данный момент, он будет информировать SQL, выполнение имени базы данных, состояние выполнения, от IP клиента, используется учетная запись, время выполнения и т.д.
производительности MySQL перед лицом серьезных проблем, в целом, так несколько возможностей:
1, индекс не завершен;
2, SQL формулировка является слишком сложным,
3, ошибка конфигурации,
4, машина не может действительно нагрузка;
1, индекс не завершен ,
если увидеть много MySQL потребляемую процессора, вы можете использовать инструмент MySQL клиент для проверки.
Выполненный под Linux
/ USR / местные / MySQL / бен / MySQL -hlocalhost-uroot - р
пароль, если нет пароля, вы можете ввести без -p параметра в интерфейсе клиента.
Посмотри на текущих условиях эксплуатации
показать полный PROCESSLIST
может работать в несколько раз больше , чем
эта команда может видеть оператор SQL выполняется в данный момент, он будет информировать SQL, выполнение имени базы данных, состояние выполнения, от IP клиента, используется учетная запись время работы и другую информацию
в моем кэше фоновым, большую часть времени нет изображения любого SQL заявления, я думаю , что это только относительно нормально. Если вы видите много инструкций SQL, это, безусловно, MySQL проблемы с производительностью ,
если есть проблемы с производительностью, можно проанализировать:
? 1, не SQL Statement застревают
Это все больше и больше в случае, если в базе данных является использование MyISAM, то может быть поток будет записывать данные в таблицу запертой, если это утверждение не завершено, другие операторы не работают.
Просмотр PROCESSLIST времени в этом, увидеть , если есть много времени выполнения инструкции, обратите внимание на эти заявления.
2, много же SQL Statement выполняется ,
если это так, то возможно , что SQL эффективность выполнения инструкции низкая, то же самое следует обратить внимание на эти заявления.
Тогда вы подозревали все заявления о сборе, использовании по алфавиту (объяснить) для рассмотрения этих заявлений.
Первый взгляд на обычный выходной DESC:
MySQL> убывание SELECT * WHERE imgid из ГИМ = 1651768337;
+ ---- + ------- + ------------- + - --------------- + ------ + --------- + --------- + ------- + ------- + ------ +
| указанный выше идентификатор | SELECT_TYPE | стол | типа | possible_keys | Key | key_len | иая | строка | Extra |
+ ---- + ------- ------ + ------- + ------- + ----- + --------- + - + ------- + ------ + -------- + -------
| 1 | SIMPLE | ГИМ | Const | ОСНОВНОЙ | ОСНОВНОЙ | 8 | Const | 1 | |
+ ------------- + ---- + ------- + ------- + ------------ + --------- + --------- + --- + ------ + ------- + -------
1 в строке набор (0,00 сек)
Примечание ключ, строка и три Extra, это утверждение возвращают результаты иллюстрируют использование запрос PRIMARY первичного ключа индекса SQL, результат представляет собой набор номер, он не показал Extra, не докажет , не использовать для сортировки или других операции. Этот результат можно сделать вывод, MySQL запросов imgid = 1651768337 этой записи из индекса, а затем удалить все поля реальной таблицы, это очень простая операция.
Ключ индекс указывает на то, что текущее использование SQL будет использовать только MySQL выполнить простое заявление с индексом, обратите внимание на это ограничение, строки возвращаются результирующий набор размер, набор результатов использовать индекс , чтобы соответствовать результаты поиска всех; Extra обычно отображает запрос и своего рода способом.
Если вы не используете ключ, или строки большие и используют FileSort рода, как правило , влияют на эффективность, например:
MySQL> убывание в SELECT * из ГИМ ГДЕ Идентификатор_пользователь = «7mini» Порядок щелчков лимита по убыванию 10;
+ ---- + ------------- + --------------- + ------- + ------ + ----- - + --------- + ------ + ------- + ----------------------- + ------
| указанный выше идентификатор | SELECT_TYPE | стол | типа | possible_keys | Key | key_len | иая | строка | Extra |
+ ---- + ------------- + - ----- --------------- + ------ + ------ + ---- + --------- + - + ------- + ----------------------------- +
| 1 | SIMPLE | ГИМ | ALL | NULL | NULL | NULL | NULL | 12506 | Использование устройства WHERE, с помощью FileSort |
+ ------------- + ----- + ---- - + --------------- + ------ + ------ + ------ + --------- + + ----------------------------- + -------
1 строки в наборе (0,00 сек)
Этот SQL результаты есть 12506 митингов, использовали FileSort, так что это будет очень потребляя эффективность исполнения. В это время реализация MySQL будет сканировать всю таблицу снова, один за другим , чтобы найти соответствие идентификатор пользователя = «7mini» запись, а затем нажимает на эти записи должны проводить сортировку, эффективность можно себе представить. Когда реальное исполнение , если найдено относительно быстро, то это потому , что память сервера также достаточно 12,506 относительно короткую записи все прочитанная в память, так что относительно быстро, но одновременно умножить или таблицу большой вверх, то эффективность серьезной проблемы.
Тогда я поставил идентификатор пользователя добавляется к индексу:
создать индексный идентификатор пользователя на ГИМ (USERID);

 

Затем проверьте:
MySQL> убывание выбрать * из ГИМ , где UserID = «7mini» порядок лимита щелчков по убыванию 10; 
+ ---- + ------------- + ------- + ------ + --------------- + -------- + --------- + ------- + ------ + --------------- -------------- + 
| ID | SELECT_TYPE | стол | типа | possible_keys | ключ | key_len | ссылка | строки | Extra | 
+ ---- + ------------- + ------- + ------ + --------------- + -------- + --------- + ------- + ------ + --------------- -------------- + 
| 1 | SIMPLE | ГИМ | ссылка | Идентификатор_пользователя | Идентификатор_пользователя | 51 | Const | 8 | Используя где; Использование FileSort | 
+ ---- + ------------- + ------- + ------ + --------------- + -------- + --------- + ------- + ------ + --------------- -------------- + 
1 строка в наборе (0,00 сек)

 


Ах, вы можете увидеть это идентификатор MySQL использовать поиск по указателю, и после поиска с индексом идента, набор результатов имеет восемь. Хотя использование FileSort то родом, а потому , что набор результатов только лишь восемь, эффективность может быть уменьшена.
Однако, если я проверю с другим идентификатором пользователем, результат будет отличаться:
MySQL> убывание выбрать * из ГИМ , где Идентификатор_пользователь = «админы» порядок лимита щелчков по убыванию 10; 
+ ---- + ------------- + ------- + ------ + --------------- + -------- + --------- + ------- + ------ + --------------- -------------- + 
| ID | SELECT_TYPE | стол | типа | possible_keys | ключ | key_len | ссылка | строки | Extra | 
+ ---- + ------------- + ------- + ------ + --------------- + -------- + --------- + ------- + ------ + --------------- -------------- + 
| 1 | SIMPLE | ГИМ | ссылка | Идентификатор_пользователя | Идентификатор_пользователя | 51 | Const | 2944 | Используя где; Использование FileSort | 
+ ---- + ------------- + ------- + ------ + --------------- + -------- + --------- + ------- + ------ + --------------- -------------- + 
1 строка в наборе (0,00 сек)

 


Этот результат Идентификатор_пользователь = «7mini» Результаты в основном такое же, но после того, как поиск индекса тузд идентификатор пользователя с размером результирующего набором для достижения 2944, который присоединится к 2944 записи памяти FileSort, эффективность намного хуже , чем это 7mini а. Тогда есть два пути решения, то первый подход связан с индексом и определяют условия, потому что мне нужно только взять максимум 10 в зависимости от трафика данных, так что есть много данных , мне не нужно , чтобы добавить к заказу смешивания, например, нажмите на менее чем 10, такие данные могут составлять большую часть.
Я добавил индекс кликов, а затем добавить еще одно условие , где запрос:
создание индекса кликов ГИМ (клики); 
MySQL> убывание выбрать * из ГИМ , где Идентификатор_пользователь = «админы» порядок лимита щелчков по убыванию 10; 
+ ---- + ------------- + ------- + ------ + --------------- + -------- + --------- + ------- + ------ + --------------- -------------- + 
| ID | SELECT_TYPE | стол | типа | possible_keys | ключ | key_len | ссылка | строки | Extra | 
+ ---- + ------------- + ------- + ------ + --------------- + -------- + --------- + ------- + ------ + --------------- -------------- + 
| 1 | SIMPLE | ГИМ | ссылка | идентификатор пользователя, щелчки | Идентификатор_пользователя | 51 | Const | 2944 | Используя где; Использование FileSort | 
+ ---- + ------------- + ------- + ------ + --------------- + -------- + --------- + ------- + ------ + --------------- -------------- + 
1 строка в наборе (0,00 сек)

 


Затем вы можете увидеть possible_keys стать USERID, щелчки, possible_keys все индексы могут соответствовать, MySQL будет определять в своих possible_keys от одного индекса для доступа и выполнить оператор, стоит отметить, что доступ к MySQL этот показатель не обязательно Он оптимизирован. MySQL Query Идентификатор_пользователь или использовать этот индекс для запроса, а не по моей воле, так что результат не был изменен. Изменение заставил MySQL SQL плюс использование индекса с использованием индекса кликов:
MySQL> убывание выбрать * из ГИМ использовать индекс (клики) , где идентификатор пользователя = «админ» и щелчки> 10 Сортировать по пределу щелчков по убыванию 10 
+ ---- + ------------- + - ----- + ------- + --------------- + -------- + --------- + - ----- + ------ + ------------- + 
| ID | SELECT_TYPE | стол | типа | possible_keys | ключ | key_len | ссылка | строки | Extra | 
+ ---- + ------------- + ------- + ------- + -------------- - + -------- + --------- + ------ + ------ + ------------- + 
| 1 | SIMPLE | ГИМ | диапазон | щелкает | щелкает | 4 | NULL | 5455 | Использование где | 
+ ---- + ------------- + ------- + ------- + -------------- - + -------- + --------- + ------ + ------ + ------------- + 
1 строка в наборе (0,00 сек)

 


Затем с помощью MySQL Query щелкает индекс, но результирующий набор Идентификатор_пользователя больше, чем кажется, все еще должны быть ограничены !:
MySQL> убывание выбрать * из ГИМ использовать индекс (клики) , где идентификатор пользователя = «админ» и щелчки> 1000 Сортировать по пределу щелчков по убыванию 10 
+ ---- + ------------- + - ----- + ------- + --------------- + -------- + --------- + - ----- + ------ + ------------- + 
| ID | SELECT_TYPE | стол | типа | possible_keys | ключ | key_len | ссылка | строки | Extra | 
+ ---- + ------------- + ------- + ------- + -------------- - + -------- + --------- + ------ + ------ + ------------- + 
| 1 | SIMPLE | ГИМ | диапазон | щелкает | щелкает | 4 | NULL | 312 | Использование где | 
+ ---- + ------------- + ------- + ------- + -------------- - + -------- + --------- + ------ + ------ + ------------- + 
1 строка в наборе (0,00 сек)

 


Тысяча была добавлена , когда 312 в набор результатов, должна быть приемлемой эффективностью сортировки.
Тем не менее, изменение индекса , используя оптимизированный метод требует принятия точки выборки, например, в данном примере это число равно 1000, так что для каждого значения идентификатора пользователя, должен найти точку выборки, так что программа очень трудно сделать а. Если пробы на 1000, то «» 7mini этого примера USERID =, результат не будет принят равным 8, а два, путаница , причиненный пользователю.
Конечно, есть еще один способ, бис Индекс:
создать индекс userid_clicks на ГИМ (идентификатор пользователя, щелчки) 
MySQL> убывание выбрать * из ГИМ , где Идентификатор_пользователь = «админы» порядок лимита щелчков по убыванию 10; 
+ ---- + ------------- + ------- + ------ + --------------- ------- + --------------- + --------- + ------- + ------ + - ------------ + 
| ID | SELECT_TYPE | стол | типа | possible_keys | ключ | key_len | ссылка | строки | Extra | 
+ ---- + ------------- + ------- + ------ + --------------- ------- + --------------- + --------- + ------- + ------ + - ------------ + 
| 1 | SIMPLE | ГИМ | ссылка | Идентификатор_пользователя, userid_clicks | userid_clicks | 51 | Const | 2944 | Использование где | 
+ ---- + ------------- + ------- + ------ + --------------- ------- + --------------- + --------- + ------- + ------ + - ------------ + 
1 строка в наборе (0,00 сек)

 


Тогда вы можете видеть, результирующий набор или полосы 2944, но FileSort Extra ушел. Затем с помощью MySQL для запроса userid_clicks этого индекса, который не только может быстро найти все записи Идентификатор_пользователя = «Admin», и результаты основаны на щелчках отсортированных! Так что не положить этот набор результатов в память своего рода, гораздо более высокая эффективность.
Но с индексом множественного поля таким образом возникает проблема, SQL - запрос , если много добрых слов, вы должны планировать его, в противном случае индекс будет построен очень много, не только будет влиять на эффективность вставки и обновления данных, а также данные листа легко повреждается.
Это оптимизация индекса подход, потому что причины могут быть более сложными, так что написано относительно долго, как правило , хорошо после оптимизации индекса, повысит эффективность MySQL п классов, поэтому нет необходимости рассмотреть вопрос о включении машины , чтобы решить эту проблему.
Однако, MySQL база данных или даже все, может и не решить проблему предела. В MySQL, ограничить индекс 0,10 до тех пор , как право, нет никаких проблем, но ограничение 100000,10 будет очень медленным, потому что MySQL будет сканировать грести хорошую последовательность результатов, то найти 100,000 эту точку, удалить 10 возврата. Для того, чтобы найти 100,000 эту точку, необходимо сканировать 100000 записей, этот цикл более отнимающий много времени. Я не знаю , не будет иметь какой - нибудь хороший алгоритм для оптимизации ядра сканирования, пытаясь думать , что я не мог думать ни о каком хорошем смысле. Для предела, в настоящее время до более отдаленного будущего, я думаю , может быть оптимизирован только через бизнес - планирование, программы и данные таблицы, которые оптимизируют так , как я думаю , тоже не панацея, а потом обсудить.
2, SQL формулировка является слишком сложным
SQL , если формулировка , используемая в некоторых специальных функций, таких как GroupBy или несколько столов совместное расследование, а затем, MySQL используется для запроса , каким образом могут быть также использованы для анализа DESC, я здесь не со случаем сложного SQL рассчитывать более , что нередко анализ, не будучи не хороший совет.
3, ошибка конфигурации
Основные параметры настраиваются в key_buffer, sort_buffer_size / myisam_sort_buffer_size, эти два параметра означают:
key_buffer = 128M: Все таблицы будут размещены в индексе эту область памяти как можно больше, индекс относительно большой, то он может быть открыт немного больше , точка, я обычно устанавливается на 128M, есть хорошее предложение, чтобы редко и относительно большой стол , чтобы найти способы , чтобы переместить в другое место , так что MySQL может значительно уменьшить объем памяти.
sort_buffer_size = 1M: один поток памяти , используемый для сортировки, запрос результирующего набор будет введен в эту память, если относительно мало, MySQL будет поставить несколько раз, так что немного на нем , чтобы открыть большой, важный является хорошим показателем и оптимизация запрос таким образом , чтобы они не генерируют большую часть результирующего набора.
Другие конфигурации:
thread_concurrency = 8: Эта конфигурация приходит стандарт = номер процессора X2
interactive_timeout = 30
wait_timeout = 30: Эти две конфигурации использует 10 до 30 секунд на нем, это позволит высвободить ресурсы памяти как можно скорее, примечание: используется связь не нарушена, такая конфигурация только отрезать связь в течение длительного времени не двигается.
query_cache: Не используйте эту функцию, многие люди теперь видят кэш писем , как это видеть ребенок, это не материалистическое. query_cache MySQL, каждый раз , когда происходит изменение данных таблицы будет вновь подключен ко всем кэш очистить таблицу, если более частые обновления, query_cache не только не помогают, но и большое влияние на эффективность. Этот параметр предназначен только для баз данных только для чтения, если вы должны использовать, только с 2 самостоятельно SQL SQL_CACHE указать некоторый кэш с query_cache_type =.
max_connections: по умолчанию является 100, при нормальных условиях является адекватным, но в целом вы хотите , чтобы открыть больше, открыты для 400-600 на нем, может иметь более чем 600, то общую эффективность, должны найти другую контрмеру, увеличение , что число в одиночку не является решением проблемы.
Другие конфигурации могут по умолчанию на нем, лично я считаю , что проблема не столь велика, как напоминание: 1, хотя конфигурация очень важна, но в большинстве случаев виновником является не вопрос эффективности. 2, MySQL представляет собой базу данных, база данных для наиболее важных эффективности не фантазии, но стабильность и точность данных.
4, он не может загрузить машину ,
если вы выше настройки, сервер или не можете себе позволить, он может быть оптимизирован только путем изменения архитектурного уровня.
1, синхронизация MySQL.
По тузда синхронизацией для синхронизации данных в несколько написанных принимающей базе данных из базы данных, предоставляя из базы данных для чтения.
Лично я не слишком увлечен , чтобы использовать синхронизацию MySQL , поскольку этот подход увеличит сложность программы, и часто приводит к ошибочной области данных. В службе с высокой нагрузкой, авария может также быстро перезапущена, но данные не так, то вы хотите восстановить больше проблем.
2, путем добавления кэша
после добавления кэша может решить проблему параллелизма, эффект очевиден. Если система в режиме реального времени, рекомендуется использовать кэш промывать путь кэша держать в актуальном состоянии .
В переднем присоединиться кальмарами архитектура выступает за использование в относительно высокой скорости попадания приложений, в основном решить проблему.
Если кэш находится внутри программной логики слоя увеличит сложность многих проблем будет более трудно решить и не рекомендуется корректировки на этом уровне.
3, программа корректировка структуры, поддержка подключение нескольких баз данных
Если веб - кэш , чтобы присоединиться к вопросу весьма серьезно, только посредством корректировки структуры программы, чтобы разбить приложение на предоставление услуг одновременно с несколькими машинами.
Если вы нарушите его, бизнес это мало влияет, если какой - либо бизнес , какую часть функции должна использовать все данные, вы можете использовать полную библиотеку + п таких архитектуры распределенных библиотек, каждое изменение в полной библиотеке и диспергируют из библиотеки в библиотечные операции один раз или заканчивая полную библиотеку на регулярной основе.
Конечно, есть одна из самых глупых, вся база данных не повреждена , чтобы сделать копии, то каждый раз , когда программа выжить полный SQL в этих библиотеках, доступ доступа опроса, я думаю , что этот путь , чем синхронизации тузда безопасность ,
4, используя MySQL прокси прокси
MySQL прокси может быть рассредоточены по доверенности базы данных каждой таблицы количеству серверов, но проблема не в состоянии решить проблему горячего стола, если популярный контент разбросан в нескольких таблицах, с таким подходом более легко в состоянии решить эту проблему.
Я не использовал это программное обеспечение серьезно не проверило, но у меня есть немного своих функций сомневаются, как он реализует совместный запрос между несколькими таблицами? Если мы сможем добиться, то насколько эффективно?
5, использование memcachedb
базы данных переключиться на memcachedb поддержки MySQL, можно попробовать идею, не оказывает никакого влияния на данных от уровня реализации и memcachedb точки зрения, не было бы никаких проблем для пользователя.
Для меня теперь из - за проблемы базы данных много, не проверял этот материал. Тем не менее, до тех пор , как он поддерживает большинство основного синтаксиса MySQL, и стабилизироваться, наличие нет необходимости сомневаться.

Ссылки: https://pan.baidu.com/s/1v5gm7n0L7TGyejCmQrMh2g  код экстракция: x2p5

свободно делиться, но серьезные ограничения X, необходимо нажать на ссылку или ссылки обязательно Поиск плюс номер группы населения 936 682 608 .

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

отwww.cnblogs.com/it-3327/p/11726265.html