2014-01-17 151 views
-2

如何優化我的插入和更新查詢..優化插入和更新查詢

更新查詢:

UPDATE `cp_sessions` 
    SET `last_activity` = 1389937578, 
     `user_id` = NULL, 
     `user_data` = 'a:3:{s:9:\"game_name\";s:5:\"poker\";s:3:\"utm\";N;s:5:\"url_1\";s:23:\"http://adda52merge.org/\";}' 
    WHERE `session_id` = '52b4aae2432db5c8236523e5357fb48d'; 

插入查詢:

INSERT INTO `cp_sessions` 
    (`session_id`, `ip_address`, `user_agent`, `last_activity`) 
VALUES (
    'a68ca9a8d4b4f9462b4439bc60d05e91', 
    '192.168.1.235', 
    'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko', 1389937583); 

這將需要Query_time:1.654473

+0

您使用Innodb,myisam的表格是什麼?桌子的大小是多少?每秒/分鐘/小時有多少個寫入?桌子的主要關鍵是什麼? session_id?有沒有定義任何索引? – aconrad

+0

嗨,表名== innodb,表大小==。02mb,時間秒,沒有主鍵和索引..所以請告訴我如何優化我的查詢無論inser和更新條件.. – Rajan

回答

1

如果您的表沒有主鍵,請添加它。 如果您有一個session_id主鍵,它將是唯一的,將不會有兩個記錄使用相同的session_id值。

ALTER TABLE `cp_sessions` 
CHANGE COLUMN `session_id` `session_id` VARCHAR(32) NOT NULL FIRST, 
ADD PRIMARY KEY (`session_id`); 

如果有重複的session_id值,然後清除他們像

CREATE TABLE blah LIKE cp_sessions; 
    ALTER TABLE `blah` CHANGE COLUMN `session_id` `session_id` VARCHAR(32) NOT NULL FIRST, 
ADD PRIMARY KEY (`session_id`); 
    INSERT IGNORE INTO blah SELECT * FROM cp_sessions; 
    RENAME TABLE cp_sessions TO cp_session_old, blah TO cp_sessions; 

這樣你就可以繼續做你在做什麼, 或者你可以有一個單一的查詢,而不執行更新分別。

INSERT INTO `cp_sessions` 
    (`session_id`, `ip_address`, `user_agent`, `last_activity`) 
VALUES (
    'a68ca9a8d4b4f9462b4439bc60d05e91', 
    '192.168.1.235', 
    'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko', 1389937583) 
ON DUPLICATE KEY UPDATE last_activity = VALUES(last_activity), user_agent = VALUES(user_agent);