2017-05-07 38 views
-1

我有一個MySQL數據庫,我決定通過刪除過時數據來清除數據,以節省空間並通過刪除不必要的數據來提高性能。令我驚訝的是,刪除了許多記錄並優化了表格後,性能下降了。我保留了舊數據庫的副本,以便可以進行性能比較。我使用不同的過濾器運行了三次查詢,我發現舊的巨大數據庫在1.2秒內完成了查詢(我的php事件探查器處於活動狀態),而新的清除的數據庫則需要5.7秒才能運行完全相同的查詢。查詢是:數據清除後MySQL數據庫性能下降

select org_members.id 
from member_calendar, days, org_members 
where org_members.org_id=1 
    and days.date="2017-07-02" 
    and days.removed=0 
    and org_members.removed=0 
    and member_calendar.day_id=days.id 
    and member_calendar.org_member_id=org_members.id; 

select org_members.id 
    from org_members 
    INNER JOIN member_calendar ON member_calendar.org_member_id=org_members.id 
    INNER JOIN days ON member_calendar.day_id=days.id 
    where org_members.org_id=1 
     and days.date="2017-07-02" 
     and days.removed=0 
     and org_members.removed=0 

我用phpMyAdmin的個人資料在這兩個分貝S中的查詢和重大變化是,將數據發送步從617微秒就在大dB至2.2在清除的一秒鐘!其他步驟也增加了,但這是巨大的差異。

使用關於查詢的解釋,大dB顯示與較小的一個不同的序列。這兩個結果,結果表明:

  • 越大表Orders表member_calendar造就35943行,而不使用鍵,然後使用主鍵,產生1行org_members然後天使用主鍵,產生1行。

  • 清除表查詢是通過首先獲取org_members而不使用主鍵並生成288行,然後使用member_calendar而不使用鍵生成32695行,然後使用主鍵併產生1行的日期來運行的。

因此,似乎dB已選擇了一種不同的方式來運行效率低得多的查詢。執行查詢時,數據庫在org_members表中使用主鍵,該查詢使用較小的數據庫對主鍵進行篩選,但將其與較大的數據庫一起使用。關於爲什麼會這樣做以及如何糾正的任何想法?這是一個普通類型的問題,應該在構造查詢時解決?我對這些結果感到非常驚訝。

我不知道下一步該怎麼做才能改善新數據庫的狀況。任何建議將非常感激。

+0

'explain [query]'的結果是什麼?清除之前和之後的解釋是否有所不同?我假設所有的指標都是一樣的。另外,清除了多少數據?從所有三張桌子? –

+0

'SHOW CREATE TABLE',please。請重寫select以使用'JOIN ... ON'語法。 –

+0

我用phpMyAdmin來分析這兩個dB的查詢,主要的變化是發送數據的步驟從大分貝的617微秒變成了被清除的分貝的2.2秒!其他步驟也增加了,但這是巨大的差異。 – Frank

回答

0

我建議這是「超標準化」的情況。一般來說,「連續」的東西,比如日期,不應該移到另一個表中。在需要它的表格中,通常可以具有更好的性能,例如DATEDATETIME

此外,如果您使用的是ENGINE=MyISAM,則降級的性能可能會提示您轉移到InnoDB。

+0

InnoDB表可以顯着提高性能嗎?我知道他們提供了諸如交易等附加功能,但是他們明白它們更耗費資源。這是不正確的?你會推薦改變表移動到InnoDB引擎嗎? – Frank

+0

磁盤使用率通常是2x-3x以上;否則InnoDB的性能通常會更好。有關轉換的更多提示:http://mysql.rjweb.org/doc.php/myisam2innodb。 MyISAM可能會陷入嚴重的碎片化; InnoDB自動處理它更好 - 因此我的_guess_關於您的引擎使用情況。 –

+0

感謝您的參考。順便說一句,days.date的字段類型是'DATE' – Frank

0

以下是幾條建議。

  1. 解釋這兩個查詢並檢查是否使用了正確的索引。
  2. 重建索引。
  3. 如果在這張表中,您正在同時讀取/插入數據,然後將表引擎類型更改爲innodb而不是myism,因爲myism會執行表鎖,這會降低選擇和讀取的速度。