0

我們爲我們管理客戶端的網站,這個網站正在處理嚴重的性能問題。這個網站建立在一個CMS內,並且同時處理最多20個訪問者。只要該網站的訪問者是該網站的唯一用戶,一切都會好起來。 CMS構建緩存並將mysql查詢的使用保持在最低限度。性能問題mysql數據庫

當我們的客戶的員工自己開始在網站上工作時,表現開始缺乏。整個工作流程通過站點,包括更新數據庫中的記錄並插入新的記錄。當記錄得到更新時,被刪除或插入的緩存被刪除,因此網站訪問者的行爲將被引用到查詢中。

我的第一個問題是mysql應該能夠處理這些請求嗎? 即使數據庫的設計不好(見下文)。 當我看到mysql中的進程列表時,我看到簡單的查詢需要15秒。 當更新或插入查詢同時進行時,這些查詢似乎只需要很長時間。

下面是保存所有記錄的大表。 網站前端使用的一切都存儲在這個表中。包括binarys在內的 。該表共有8,676條記錄。 前端有很多查詢使用WHERE,例如Variabele5或Variabele6 這些Variabele字段的值取決於contenttype。

的WHERE是例如:

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

,所有的員工在沒有得到緩存的工作環境。 在此環境中,有幾個列表,包括訂單和搜索選項。 這些查詢儘可能memcached,但是當記錄更新,刪除或插入時,memcache被清除。這與插入,更新和刪除操作相結合可能是瓶頸。

所以我的問題是應該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英特爾(R)至強(R)CPU L5630 @ 2.13GHz的

 
+---------------------------------------------------------------------------+ 
|         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         | 
+---------------------------------------------------------------------------+ 

如果我需要提供什麼信息,請讓我知道。

編輯:一些示例querys

的querys有所不同,但這裏有一些例子:

爲僱員搜索查詢:

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 |  |  | 
+----+-------------+-------+--------------+------+--------------------+-------------+-----+-------+---------+----------------------------------------------+------+-------+ 
+0

如何發佈您的查詢,在其上發佈EXPLAIN以顯示MySQL如何執行它們? – hd1

+0

也請向我們展示SQL語句。 –

+0

添加了一些查詢示例 – Jeroen

回答

1

從你已經給了我們唯一的查詢例子,Variabele5和Variabele6沒有索引,並有可能是大量的具有的contentType = 35的記錄,所以查詢是可能不會非常有效地使用索引。更多的查詢例子可能會幫助我們獲得更好的圖像。

但是,表的大小似乎不是很大,這讓我認爲緩存的實際重建可能是真正的原因。所以你可能想看看應用程序中使用的緩存策略。我不知道你可以做多少測試,但是我會嘗試在緩存關閉的情況下測試你的場景。

+0

Variabele5和Variabele6確實沒有編入索引,這是因爲這些字段的值根據內容類型而有所不同。因此對於contenttype 35,我們可以使用索引,但其他內容類型使用該字段來處理不同的數據。 緩存被刪除後,它不會立即全部重建。 頁面被訪問後,它獲得緩存,所以這不是一個真正的沉重的過程。內存緩存也是如此。 – Jeroen

0

首先,你的數據庫是一團糟。但是,考慮到您的硬件和相對較小的數據量,我期望查詢速度非常快。

如果查詢很慢,很可能是因爲「where」條件的通配符 - 例如profiel.title LIKE '%Rem%'。你可以用全文搜索替換它。

另一個設計問題是在數據庫中存儲二進制文件;這取決於二進制文件的大小,這可能會對磁盤IO性能產生很大的影響,通常情況下,二進制文件的編碼/解碼(通常要求數據庫連接保持打開狀態)可能比僅僅讀取文本慢得多/結果集中的數字。考慮在文件系統上緩存二進制文件,如果你知道他們已經改變,只能去他們的數據庫。但是,在深入研究數據庫之前,我認爲您需要找到一種方法來確定性能問題,因此您知道您正在解決正確的問題。考慮使用profiler來查找瓶頸,然後處理具體問題。

+0

感謝您的回覆,那正是我在開始優化沒有必要的事情之前試圖「解決問題」的內容。我會看看你提供的profiler鏈接謝謝。 – Jeroen