Mysql

MySQL 沒有響應,寫入網路狀態

  • December 3, 2012

我只需要重新啟動 MySQL 即可重新訪問我的某些網站。它使用了不到 300MB 的 RAM。另一個產品執行良好,訪問它自己的 InnoDB 表。

這是我重新啟動之前的顯示程序列表:

3629079 user    ip:4815 web Query   2324    Writing to net  SELECT * FROM web.files order by file_name_eng desc
3632228 user    ip:4817 null    Sleep   2323        null
3632453 user    ip:4818 null    Sleep   2323        null
3649490 user2   127.0.0.1:28050 null    Query   1967    Locked  UPDATE web.files SET date_publish_test = NOW(), uuser_id = 2 WHERE file_id = 20454

這是一個簡單的選擇,這裡是它的解釋(總共 35K 記錄,輸入 MyISAM):

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   SIMPLE  files   ALL null    null    null    null    30593   Using filesort

版本:Windows 2003 上的 5.0.54a-enterprise-gpl-nt。

我這樣做正確嗎?

你的問題很簡單。

  • 您提到該表使用 MyISAM 儲存引擎。

  • 程序列表顯示

    • 程序 ID 3629079 正在執行SELECT * FROM web.files order by file_name_eng desc
    • SELECT 已執行 2324 秒(39 分 44 秒)
    • 程序 ID 3649490 正在執行 UPDATE 查詢
    • SELECT 已阻止 UPDATE 1967 秒(32 分 47 秒)

注意:MyISAM 表上的任何 INSERT、UPDATE、DELETE 每次都需要一個全表鎖

注意:如果在一個表上發出一系列 50 個 UPDATE,則每個 UPDATE 都需要一個全表鎖

建議 #1

如果web.files沒有 FULLTEXT 索引,則應轉換web.files為 InnoDB

ALTER TABLE web.files ENGINE=InnoDB;

我建議這樣做是因為InnoDB將允許 UPDATE、DELETE 和 INSERT 通過MVCCTransaction Isolation與 SELECT 和諧共存。

如果您不是項目經理/首席開發人員,請在執行此操作之前諮詢您的項目經理/首席開發人員。

建議 #2

SELECT * FROM web.files order by file_name_eng desc

從 EXPLAIN 計劃中,我可以看到查詢

  1. 查詢必須進行全表掃描,因為沒有WHERE子句
  2. 列上沒有索引file_name_eng,因此對錶的排序沒有幫助(會發生文件排序,但發生得很快)

因此,您應該執行

ALTER TABLE web.files ADD INDEX (file_name_eng);

修辭問題

  • 你需要SELECT *嗎?
  • 你能只列出你真正需要的列嗎?

引用自:https://dba.stackexchange.com/questions/29607