Проблемы с производительностью база данных MySQL

Мы управляем веб-сайтом для клиента, этот веб-сайт имеет серьезные проблемы с производительностью. Этот веб-сайт создан на базе CMS и одновременно обслуживает не более 20 посетителей. Пока посетители сайта являются единственными пользователями сайта, все идет хорошо. CMS создает кеш, а использование запросов mysql сведено к минимуму.

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

Мой первый вопрос: сможет ли mysql обрабатывать эти запросы? Несмотря на то, что дизайн базы данных плохой (см. Ниже). Когда я смотрю список процессов в mysql, я вижу, что простые запросы занимают до 15 секунд. эти запросы, кажется, занимают так много времени, если одновременно выполняются запросы на обновление или вставку.

под большой таблицей, содержащей все записи. все, что используется интерфейсом веб-сайта, хранится в этой одной таблице. включая бинарные файлы. В таблице содержится 8676 записей. Во внешнем интерфейсе есть много запросов, которые используют WHERE, например, для Variabele5 или Variabele6. Значение этих полей Variabele зависит от типа содержимого.

Например, ГДЕ:

WHERE Variabele5 > 500 AND Variabele6 =2 AND contenttype = 35

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

Итак, мой вопрос в том, сможет ли mysql справиться со всем этим или дизайн базы данных не подходит для обработки запросов.

+---------------+---------------+------+-----+---------+----------------+
|     Field     |     Type      | Null | Key | Default |     Extra      |
+---------------+---------------+------+-----+---------+----------------+
| nr            | mediumint(80) | NO   | PRI | NULL    | auto_increment |
| hidden        | int(1)        | NO   |     | 0       |                |
| Title         | varchar(255)  | NO   | MUL |         |                |
| Body          | text          | NO   |     | NULL    |                |
| Description   | text          | NO   |     | NULL    |                |
| user_id       | mediumint(80) | NO   |     | 0       |                |
| addate        | varchar(255)  | NO   |     | NULL    |                |
| moddate       | varchar(255)  | NO   |     | NULL    |                |
| contenttype   | mediumint(80) | NO   | MUL | 0       |                |
| parent        | mediumint(80) | NO   |     | 0       |                |
| Status        | mediumint(80) | NO   | MUL | NULL    |                |
| CODE          | varchar(255)  | NO   | MUL | NULL    |                |
| menu          | mediumint(80) | NO   |     | NULL    |                |
| filetype      | mediumint(80) | NO   |     | NULL    |                |
| folder        | int(11)       | NO   |     | NULL    |                |
| sortIndex     | bigint(255)   | NO   |     | NULL    |                |
| servercache   | int(1)        | NO   |     | 1       |                |
| futurecache   | int(1)        | NO   |     | NULL    |                |
| publishFrom   | date          | YES  |     | NULL    |                |
| publishUntil  | date          | YES  |     | NULL    |                |
| pinned        | int(11)       | YES  |     | NULL    |                |
| keywords      | text          | NO   |     | NULL    |                |
| latestversion | int(11)       | NO   |     | NULL    |                |
| permalink     | text          | NO   |     | NULL    |                |
| Integer1      | int(12)       | NO   |     | 0       |                |
| Integer2      | int(4)        | NO   |     | 0       |                |
| Integer3      | int(4)        | NO   |     | 0       |                |
| Integer4      | int(4)        | NO   |     | 0       |                |
| Variabele1    | varchar(255)  | NO   |     |         |                |
| Variabele2    | varchar(255)  | NO   |     |         |                |
| Variabele3    | varchar(255)  | NO   |     |         |                |
| Variabele4    | varchar(255)  | NO   |     |         |                |
| Date1         | varchar(255)  | NO   |     |         |                |
| Date2         | varchar(255)  | NO   |     |         |                |
| Text1         | text          | NO   |     | NULL    |                |
| Text2         | text          | NO   |     | NULL    |                |
| Text3         | text          | NO   |     | NULL    |                |
| Binary1       | longblob      | NO   |     | NULL    |                |
| Binary1Type   | varchar(255)  | NO   |     | NULL    |                |
| Binary2       | longblob      | NO   |     | NULL    |                |
| Binary2Type   | varchar(255)  | NO   |     | NULL    |                |
| Binary3       | longblob      | NO   |     | NULL    |                |
| Binary3Type   | varchar(255)  | NO   |     | NULL    |                |
| browseAccess  | varchar(255)  | NO   |     | NULL    |                |
| Binary4       | longblob      | NO   |     | NULL    |                |
| Binary4Type   | varchar(255)  | NO   |     | NULL    |                |
| Binary5       | longblob      | NO   |     | NULL    |                |
| Binary5Type   | varchar(255)  | NO   |     | NULL    |                |
| Binary6       | longblob      | NO   |     | NULL    |                |
| Binary6Type   | varchar(255)  | NO   |     | NULL    |                |
| Integer5      | int(11)       | NO   |     | NULL    |                |
| Integer6      | int(11)       | NO   |     | NULL    |                |
| Variabele6    | varchar(255)  | NO   |     | NULL    |                |
| Binary7       | longblob      | NO   |     | NULL    |                |
| Binary7Type   | varchar(255)  | NO   |     | NULL    |                |
| Binary8       | longblob      | NO   |     | NULL    |                |
| Binary8Type   | varchar(255)  | NO   |     | NULL    |                |
| Binary9       | longblob      | NO   |     | NULL    |                |
| Binary9Type   | varchar(255)  | NO   |     | NULL    |                |
| Binary10      | longblob      | NO   |     | NULL    |                |
| Binary10Type  | varchar(255)  | NO   |     | NULL    |                |
| Binary11      | longblob      | NO   |     | NULL    |                |
| Binary11Type  | varchar(255)  | NO   |     | NULL    |                |
| Binary12      | longblob      | NO   |     | NULL    |                |
| Binary12Type  | varchar(255)  | NO   |     | NULL    |                |
| Binary13      | longblob      | NO   |     | NULL    |                |
| Binary13Type  | varchar(255)  | NO   |     | NULL    |                |
| Binary14      | longblob      | NO   |     | NULL    |                |
| Binary14Type  | varchar(255)  | NO   |     | NULL    |                |
| Binary15      | longblob      | NO   |     | NULL    |                |
| Binary15Type  | varchar(255)  | NO   |     | NULL    |                |
| Text4         | text          | NO   |     | NULL    |                |
| Text5         | text          | NO   |     | NULL    |                |
| Text6         | text          | NO   |     | NULL    |                |
| Text7         | text          | NO   |     | NULL    |                |
| Text8         | text          | NO   |     | NULL    |                |
| Variabele5    | varchar(255)  | NO   |     | NULL    |                |
| Variabele7    | varchar(255)  | NO   |     | NULL    |                |
| Variabele8    | varchar(255)  | NO   |     | NULL    |                |
| Variabele9    | varchar(255)  | NO   |     | NULL    |                |
| Variabele10   | text          | NO   |     | NULL    |                |
| Variabele11   | varchar(255)  | NO   |     | NULL    |                |
| Variabele12   | varchar(255)  | NO   |     | NULL    |                |
| Variabele13   | varchar(255)  | NO   |     | NULL    |                |
| Variabele14   | varchar(255)  | NO   |     | NULL    |                |
| Variabele15   | varchar(255)  | NO   |     | NULL    |                |
| Variabele16   | varchar(255)  | NO   |     | NULL    |                |
| Variabele17   | varchar(255)  | NO   |     | NULL    |                |
| Variabele18   | varchar(255)  | NO   |     | NULL    |                |
| Variabele19   | varchar(255)  | NO   |     | NULL    |                |
| Variabele20   | varchar(255)  | NO   |     | NULL    |                |
| Variabele21   | varchar(255)  | NO   |     | NULL    |                |
| Variabele22   | varchar(255)  | NO   |     | NULL    |                |
| Variabele23   | varchar(255)  | NO   |     | NULL    |                |
| Variabele24   | varchar(255)  | NO   |     | NULL    |                |
| Variabele25   | varchar(255)  | NO   |     | NULL    |                |
| Variabele26   | varchar(255)  | NO   |     | NULL    |                |
| Variabele27   | varchar(255)  | NO   |     | NULL    |                |
| Variabele28   | varchar(255)  | NO   |     | NULL    |                |
| Variabele29   | varchar(255)  | NO   |     | NULL    |                |
| Variabele30   | varchar(255)  | NO   |     | NULL    |                |
| Variabele31   | varchar(255)  | NO   |     | NULL    |                |
| Variabele32   | varchar(255)  | NO   |     | NULL    |                |
| Variabele33   | varchar(255)  | NO   |     | NULL    |                |
| Variabele34   | varchar(255)  | NO   |     | NULL    |                |
| Variabele35   | varchar(255)  | NO   |     | NULL    |                |
| Variabele36   | varchar(255)  | NO   |     | NULL    |                |
| Variabele37   | varchar(255)  | NO   |     | NULL    |                |
| Variabele38   | varchar(255)  | NO   |     | NULL    |                |
| Variabele39   | varchar(255)  | NO   |     | NULL    |                |
| Variabele40   | varchar(255)  | NO   |     | NULL    |                |
| Variabele41   | varchar(255)  | NO   |     | NULL    |                |
| Variabele42   | varchar(255)  | NO   |     | NULL    |                |
| Variabele43   | varchar(255)  | NO   |     | NULL    |                |
| Variabele44   | varchar(255)  | NO   |     | NULL    |                |
| Variabele45   | varchar(255)  | NO   |     | NULL    |                |
| Variabele46   | varchar(255)  | NO   |     | NULL    |                |
| Variabele47   | varchar(255)  | NO   |     | NULL    |                |
| Variabele48   | varchar(255)  | NO   |     | NULL    |                |
| Variabele49   | varchar(255)  | NO   |     | NULL    |                |
| Variabele50   | varchar(255)  | NO   |     | NULL    |                |
+---------------+---------------+------+-----+---------+----------------+

индексы:

+-------------+--------------+--------------+-------------+------+
|  Key_name   | Seq_in_index | Column_name  | Cardinality | Null |
+-------------+--------------+--------------+-------------+------+
| PRIMARY     |            1 | nr           |        8675 |      |
| Status      |            1 | Status       |           5 |      |
| Status      |            2 | publishFrom  |        8675 | YES  |
| Status      |            3 | publishUntil |        8675 | YES  |
| CODE        |            1 | CODE         |        4337 |      |
| CODE        |            2 | Title        |        4337 |      |
| contenttype |            1 | contenttype  |          30 |      |
| Title       |            1 | Title        |        2891 |      |
+-------------+--------------+--------------+-------------+------+

Информация о СЕРВЕРЕ: 4x Intel (R) Xeon (R) CPU L5630 @ 2,13 ГГц

+---------------------------------------------------------------------------+
|                                 free -mt                                  |
+---------------------------------------------------------------------------+
|              total       used       free     shared    buffers     cached |
| Mem:          4096       3841        254          0         44       1223 |
| -/+ buffers/cache:       2573       1522                                  |
| Swap:         1023        422        601                                  |
| Total:        5119       4263        856                                  |
+---------------------------------------------------------------------------+

Если мне нужно предоставить дополнительную информацию, пожалуйста, дайте мне знать.

РЕДАКТИРОВАТЬ: некоторые примеры запросов

Запросы различаются, но вот несколько примеров:

Поисковый запрос для сотрудника:

EXPLAIN SELECT profiel.nr as nr, CONCAT(profiel.title,' ',profiel.Variabele49) as naam,profiel.Variabele3 as tel, profiel.Variabele44 as huurprijs, profiel.Variabele5 as inkomen, profiel.Variabele39 as  personen, profiel.Variabele46 as perdatum, profiel.addate as inschrijving, profiel.text1 as opmerkingen, medewerker.Title as m_naam,profiel.Variabele48 as lang FROM  site_content as profiel    left join vw_activeContent as medewerker on medewerker.nr = profiel.Variabele9  WHERE  profiel.contenttype =26  AND (profiel.Status=3 OR  profiel.Text8='Nee')  AND (  profiel.nr  LIKE '%Rem%' OR  profiel.title LIKE '%Rem%' OR ' ' LIKE '%Rem%' OR  CONCAT(profiel.title,' ',profiel.Variabele49)  LIKE '%Rem%' OR profiel.Variabele49  LIKE '%Rem%' OR profiel.Variabele3  LIKE '%Rem%' OR  profiel.Variabele44  LIKE '%Rem%' OR  profiel.Variabele5  LIKE '%Rem%' OR  profiel.Variabele39  LIKE '%Rem%' OR  profiel.Variabele46  LIKE '%Rem%' OR  profiel.addate  LIKE '%Rem%' OR  profiel.text1  LIKE '%Rem%' OR  medewerker.Title  LIKE '%Rem%' OR profiel.Variabele48  LIKE '%Rem%' OR profiel.Variabele1 LIKE '%Rem%' OR profiel.Variabele3 LIKE '%Rem%' )  ORDER BY  profiel.sortIndex
+----+-------------+-------+--------------+--------+----------------+--------------------+-------------+---+---------+--------------------+---+-------------+-----------------------------+-------+
| id | select_type | table |              |  type  | possible_keys  |                    |     key     |   | key_len |        ref         |   |             |            rows             | Extra |
+----+-------------+-------+--------------+--------+----------------+--------------------+-------------+---+---------+--------------------+---+-------------+-----------------------------+-------+
|  1 | SIMPLE      |       | profiel      |        | ref            | Status,contenttype | contenttype | 3 | const   |                    |   | 1700        | Using where; Using filesort |       |
|  1 | SIMPLE      |       | site_content | eq_ref | PRIMARY,Status |                    | PRIMARY     |   | 3       | profiel.Variabele9 | 1 | Using where |                             |       |
+----+-------------+-------+--------------+--------+----------------+--------------------+-------------+---+---------+--------------------+---+-------------+-----------------------------+-------+

Посетитель по поисковому запросу

EXPLAIN SELECT nr, title AS adres, Description AS description, Binary3 AS bin, Variabele2 AS 
TYPE , Text3, Text2 AS verhuurd, Integer2 AS kamers, Integer3 AS personen, Variabele4 AS inclusief, Text1 AS oplevering, Integer5 AS huurpijs, Variabele6 AS wijk, moddate
FROM vw_activeContent
WHERE contenttype =22
AND Integer2 >=2
AND Integer3 >=1
AND Integer5 >380
AND Integer5 <770
ORDER BY Integer5 ASC
+----+-------------+-------+--------------+------+--------------------+-------------+-----+-------+---------+-----------------------------+------+-------+
| id | select_type | table |              | type |   possible_keys    |             | key |       | key_len |             ref             | rows | Extra |
+----+-------------+-------+--------------+------+--------------------+-------------+-----+-------+---------+-----------------------------+------+-------+
|  1 | SIMPLE      |       | site_content | ref  | Status,contenttype | contenttype |   3 | const |     696 | Using where; Using filesort |      |       |
+----+-------------+-------+--------------+------+--------------------+-------------+-----+-------+---------+-----------------------------+------+-------+

запрос, который широко используется:

EXPLAIN SELECT DISTINCT Variabele2
FROM site_content
WHERE contenttype =22
AND STATUS =1
ORDER BY Variabele2 ASC
+----+-------------+-------+--------------+------+--------------------+-------------+-----+-------+---------+----------------------------------------------+------+-------+
| id | select_type | table |              | type |   possible_keys    |             | key |       | key_len |                     ref                      | rows | Extra |
+----+-------------+-------+--------------+------+--------------------+-------------+-----+-------+---------+----------------------------------------------+------+-------+
|  1 | SIMPLE      |       | site_content | ref  | Status,contenttype | contenttype |   3 | const |     696 | Using where; Using temporary; Using filesort |      |       |
+----+-------------+-------+--------------+------+--------------------+-------------+-----+-------+---------+----------------------------------------------+------+-------+

person Jeroen    schedule 04.12.2012    source источник
comment
Как насчет того, чтобы размещать свои запросы, размещать на них EXPLAIN, чтобы показать, как MySQL их выполняет?   -  person hd1    schedule 04.12.2012
comment
Пожалуйста, также покажите нам инструкцию SQL.   -  person Roger Ng    schedule 04.12.2012
comment
Являются ли отправленные вами образцы запросов медленными при выполнении в командной строке MySQL (в отличие от PHP?)   -  person Neville Kuyt    schedule 04.12.2012
comment
Это зависит от других действий на сервере: если в списке процессов еще ожидают запросы, запрос может занять до 10-20 секунд. Если больше ничего нет, он выполняется за ‹1 сек.   -  person Jeroen    schedule 04.12.2012
comment
Если в идеальных условиях запрос выполняется быстро, проблема, вероятно, заключается не в самом запросе, а в плохом использовании транзакций (вы используете InnoDB?) Или в проблеме конфигурации сервера - достаточно ли вы выделили памяти для MySQL?   -  person Neville Kuyt    schedule 04.12.2012
comment
Наверное, да, но как мне найти эту проблему. таблица - MyISAM. Не уверен, где найти память, выделенную для MySQL. Это в my.cnf?   -  person Jeroen    schedule 04.12.2012
comment
Я вообще-то никогда не смотрел на тип таблицы, может в этом проблема? MyISAM блокирует всю таблицу при вставке или обновлении, верно?   -  person Jeroen    schedule 04.12.2012


Ответы (2)


Из единственного примера запроса, который вы указали, Variabele5 и Variabele6 не индексируются, и, вероятно, существует много записей с contenttype = 35, поэтому запросы, вероятно, не очень эффективно используют индексы. Дополнительные примеры запросов могут помочь нам получить лучшее представление.

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

person Community    schedule 04.12.2012
comment
Variabele5 и Variabele6 действительно не индексируются, потому что значения этих полей различаются в зависимости от типа содержимого. поэтому для contenttype 35 мы могли бы использовать индекс, но другие contenttypes используют поле с разными данными. После удаления кеша его не перестраивают сразу. после посещения страницы она кэшируется, так что это не очень сложный процесс. То же самое и с кешем памяти. - person Jeroen; 04.12.2012

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

Если запросы выполняются медленно, вероятно, из-за подстановочных знаков в критерии «где» - например, profiel.title LIKE '%Rem%'. Вы можете заменить это полнотекстовым поиском.

Другая проблема дизайна - хранение двоичных файлов в базе данных; в зависимости от размера двоичных файлов это может иметь большое влияние на производительность дискового ввода-вывода, и - обычно - кодирование / декодирование двоичных файлов (которое часто требует, чтобы соединение с базой данных оставалось открытым) может быть значительно медленнее, чем просто чтение текста / числа из набора результатов. Рассмотрите возможность кэширования двоичных файлов в файловой системе и переходите к базе данных для них только в том случае, если вы знаете, что они изменились.

Однако, прежде чем копаться в базе данных, я думаю, вам нужно найти способ решить проблему с производительностью, чтобы вы знали, что устраняете правильную проблему. Рассмотрите возможность использования профилировщика, чтобы найти узкое место, а затем поработайте над конкретная проблема.

person Neville Kuyt    schedule 04.12.2012
comment
Спасибо за ответ, именно это я и пытаюсь решить, прежде чем приступить к оптимизации ненужных вещей. Я посмотрю на ссылку профилировщика, которую вы предоставили, спасибо. - person Jeroen; 04.12.2012