簡體   English   中英

MySQL插入查詢隨機花費很長時間

[英]MySQL Insert Query Randomly Takes a Long Time

我正在使用MySQL管理PHP應用程序的會話數據。 在測試應用程序時,它通常非常快速且響應迅速。 但是,看似隨機的響應會停頓幾秒鍾后最終完成。 我將問題縮小為會話寫查詢,該查詢看起來像這樣:

INSERT INTO Session VALUES('lvg0p9peb1vd55tue9nvh460a7', '1275704013', '') ON DUPLICATE KEY UPDATE sessAccess='1275704013',sessData='';

慢查詢日志具有以下信息:

Query_time: 0.524446  Lock_time: 0.000046 Rows_sent: 0  Rows_examined: 0

每10次發生這種情況約1次。 該查詢通常只需要約0.0044秒。

該表是具有大約60行的InnoDB。 sessId是具有BTREE索引的主鍵。

由於可以在每個頁面視圖上進行訪問,因此顯然這不是可接受的執行時間。 為什么會這樣呢?

更新:表架構為:sessId:varchar(32),sessAccess:int(10),sessData:text

請注意,插入到BTree索引的中間確實確實需要經常釋放頁面,並且需要重建索引的一部分。 對於聚集索引(您的主鍵可能是聚集索引),在重建頁面時也必須移動實際的行數據。

如果行數據很大,將需要一些時間。

對於您的情況,最好使用自動增量主鍵,並且僅在sessId上使用唯一索引,因此您無需在集群索引的中間插入記錄。

在非VM上重現該問題,然后您可以投訴。

根據我的經驗,虛擬機,尤其是與任意第三方共享的虛擬機,具有無法依靠的行為。

innoDB很可能正在嘗試執行fdatasync()。 這需要做一些實際的物理IO,但主機盒上的另一個任務(也許是另一個VM)正在執行某項操作,因此阻止了它。 如果您不控制它們,則無法預測其行為。

如果會話表在數據庫關閉期間不需要保持持久性,請考慮ENGINE = Memory。

如果您對數據的持久性沒有嚴格的要求,請減少innodb的持久性設置(但這會影響整個服務器,而不僅僅是表格)

按建議嘗試使用代理自動增量鍵,但是執行查詢時仍然存在速度問題。

解決方案是將表的引擎切換到MyISAM,這樣可以更快地插入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM