我有一個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表中使用主鍵,該查詢使用較小的數據庫對主鍵進行篩選,但將其與較大的數據庫一起使用。關於爲什麼會這樣做以及如何糾正的任何想法?這是一個普通類型的問題,應該在構造查詢時解決?我對這些結果感到非常驚訝。
我不知道下一步該怎麼做才能改善新數據庫的狀況。任何建議將非常感激。
'explain [query]'的結果是什麼?清除之前和之後的解釋是否有所不同?我假設所有的指標都是一樣的。另外,清除了多少數據?從所有三張桌子? –
'SHOW CREATE TABLE',please。請重寫select以使用'JOIN ... ON'語法。 –
我用phpMyAdmin來分析這兩個dB的查詢,主要的變化是發送數據的步驟從大分貝的617微秒變成了被清除的分貝的2.2秒!其他步驟也增加了,但這是巨大的差異。 – Frank