Mysql
MySQL 沒有響應,寫入網路狀態
我只需要重新啟動 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
為 InnoDBALTER TABLE web.files ENGINE=InnoDB;
我建議這樣做是因為InnoDB將允許 UPDATE、DELETE 和 INSERT 通過MVCC和Transaction Isolation與 SELECT 和諧共存。
如果您不是項目經理/首席開發人員,請在執行此操作之前諮詢您的項目經理/首席開發人員。
建議 #2
SELECT * FROM web.files order by file_name_eng desc
從 EXPLAIN 計劃中,我可以看到查詢
- 查詢必須進行全表掃描,因為沒有
WHERE
子句- 列上沒有索引
file_name_eng
,因此對錶的排序沒有幫助(會發生文件排序,但發生得很快)因此,您應該執行
ALTER TABLE web.files ADD INDEX (file_name_eng);
修辭問題
- 你需要
SELECT *
嗎?- 你能只列出你真正需要的列嗎?