我的ECSHOP cpu占用很高,人高峰的時候(幾十個人同時在線),CPU甚至100% ,以前用虛擬主機是這樣,用自己的服務器也是這樣,經過觀察,主要是以下的一些語句導致
Sql 代碼SELECT DISTINCT SUM( goods_number ) AS num FROM `ecshopdb`.`ecs_order_info` AS o, `ecshopdb`.`ecs_order_goods` AS g WHERE o.order_id = g.order_id AND o.order_status = '1' AND o.shipping_status IN ( '1', '2' ) AND o.pay_status IN ( '2', '1' ) GROUP BY g.goods_id HAVING num >31Sql 代碼
SELECT g.goods_id, g.goods_name, g.goods_img, SUM( og.goods_number ) AS goods_number FROM `ecshopdb`.`ecs_goods` AS g, `ecshopdb`.`ecs_order_info` AS o, `ecshopdb`.`ecs_order_goods` AS og WHERE g.is_on_sale =1 AND g.is_alone_sale =1 AND g.is_delete =0 AND og.order_id = o.order_id AND og.goods_id = g.goods_id AND o.order_status = '1' AND ( o.pay_status = '2' OR o.pay_status = '1' ) AND ( o.shipping_status = '1' OR o.shipping_status = '2' ) GROUP BY g.goods_id ORDER BY goods_number DESC , g.goods_id DESC LIMIT 10
特別好像是這個查詢的時候,cpu就一下子上去,
解決思路一:翻遍了ecshop論壇裡面文章,找到pick_out.PHP的問題(屬性過多 導致MySQL負載過大),下載他們的補丁,打上去以後沒用
解決思路二:可以用PHPmyadmin直接清空session表,沒用
解決思路三:ecs_order_action 這個表3萬9 ecs_order_goods 5萬3 ecs_order_info 1萬1 時間2009.3-2009.8 半年的訂單,半年前清理過一次,好過一段時間,後來慢慢又上來了,看來是數據過多照成的?不過目前數據還有用,無法清理
解決思路四:是不是因為索引沒建,導致的查詢慢?於是使用PHPmyadmin把上面語句中的where order group的字段全部建了索引,似乎好多了,但還要繼續觀察
解決思路五:是不是MySQL的tmp_table_size 太小,調到500M也沒用
可能的原因:
1.是不是搜索引擎蜘蛛?
2.是不是域名給小黑客練手了,發現了幾個亂注冊的會員
3.索引沒建,導致查詢慢
4.數據過多,查詢過慢
網上查了些MySQL的優化方法,收藏
1.增加 tmp_table_size 值。mysql 的配置文件中,tmp_table_size 的默認大小是 32M。如果一張臨時表超出該大小,MySQL產生一個 The table tbl_name is full 形式的錯誤,如果你做很多高級 GROUP BY 查詢,增加 tmp_table_size 值。 這是 MySQL 官方關於此選項的解釋
2.對 WHERE, JOIN, MAX(), MIN(), ORDER BY 等子句中的條件判斷中用到的字段,應該根據其建立索引 INDEX。索引被用來快速找出在一個列上用一特定值的行。沒有索引,MySQL不得不首先以第一條記錄開始並然後讀完整個表直到它找出相關的行。表越大,花費時間越多。如果表對於查詢的列有一個索引,MySQL能快速到達一個位置去搜尋到數據文件的中間,沒有必要考慮所有數據。如果一個表有1000行,這比順序讀取至少快100倍。所有的MySQL索引(PRIMARY、UNIQUE和INDEX)在B樹中存儲。
Sql 代碼