程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> ECSHOP cpu占用很高甚至100% -mysql 優化

ECSHOP cpu占用很高甚至100% -mysql 優化

編輯:關於MYSQL數據庫

我的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 >31
    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 >31
    Sql 代碼
  • 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
    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 代碼
  • 索引 index 用於:
  • 快速找出匹配一個WHERE子句的行
  • 當執行聯結(JOIN)時,從其他表檢索行。
  • 對特定的索引列找出MAX()或MIN()值
  • 如果排序或分組在一個可用鍵的最左面前綴上進行(例如,ORDER BY key_part_1,key_part_2),排序或分組一個表。如果所有鍵值部分跟隨DESC,鍵以倒序被讀取。
  • 在一些情況中,一個查詢能被優化來檢索值,不用咨詢數據文件。如果對某些表的所有使用的列是數字型的並且構成某些鍵的最左面前綴,為了更快,值可以從索引樹被檢索出來。
  • 假定你發出下列SELECT語句:
  • MySQL> SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;
  • 如果一個多列索引存在於col1和col2上,適當的行可以直接被取出。如果分開的單行列索引存在於col1和col2上,優化器試圖通過決定哪個索引將找到更少的行並來找出更具限制性的索引並且使用該索引取行。
    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved