今天,資料庫的操作越來越成為整個應用的效能瓶頸了,這點對於Web應用尤其明顯。關於資料庫的效能,這不只是DBA需要擔心的事,而這更是我們程式設計師需要去關注的事情。當我們去設計資料庫表結構,對操作資料庫時(尤其是查表時的SQL語句),我們都需要注意資料操作的效能。這裡,我們不會講過多的SQL語句的最佳化,而只是針對MySQL這一Web應用最多的資料庫。希望下面的這些優化技巧對你有用。
1.表格結構
CREATE TABLE `room_break_history_tmp_test ` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `break_type` INT(11) DEFAULT NULL, `app_id` INT(11) DEFAULT NULL, `room_id` INT(11) DEFAULT NULL, `from_user_id` INT(11) DEFAULT NULL, `to_user_id` INT(11) DEFAULT NULL, `content_type` INT(11) DEFAULT NULL, `content_name` VARCHAR(300) DEFAULT NULL, `source_message` VARCHAR(1536) DEFAULT NULL, `send_message` VARCHAR(1536) DEFAULT NULL, `request_type` INT(4) DEFAULT NULL, `report_relation` VARCHAR(1536) DEFAULT NULL, `handle_type` INT(11) DEFAULT NULL, `handle_uid` INT(11) DEFAULT NULL, `create_time` DATETIME DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_from_user_id` (`room_id`,`from_user_id`,`handle_type`,`create_time`) ) ENGINE=INNODB AUTO_INCREMENT=3416971 DEFAULT CHARSET=utf8mb4
2.執行語句
DESC SELECT COUNT(1) FROM (SELECT COUNT(1) FROM room_break_history_tmp_test WHERE `create_time` BETWEEN '2017-07-01 22:25:33' AND '2017-07-01 22:27:00' AND handle_type = 5 GROUP BY room_id, from_user_id) AS keywordtemp
3 .執行計畫
id select_type table type possible_keys key key_len ref rows Extra ------ ----------- ------------------ ------ ---------------- ---------------- ------- ------ ------- -------------------------- 1 PRIMARY <derived2> ALL (NULL) (NULL) (NULL) (NULL) 3438331 (NULL) 2 DERIVED room_break_history index idx_from_user_id idx_from_user_id 21 (NULL) 3438331 Using where; Using index
4.執行長:
Execution Time : 17.182 sec
Transfer Time : 0.001 sec
Total Time : 17.184 sec
5.描述,就執行計劃看,type為index,key及key_len正常,看似是走了索引,但是rows幾乎是全表記錄(不准確,就是全表掃描),300多萬的數據執行時長居然17秒。
思考:將字段的nullable改為not null後,key_len變短了,是不是將是否為空的判斷邏輯添加到了資料上?
有關null的文章:
改進:
1.新增索引
ALTER TABLE `test`.`room_break_history_tmp_test` -> ADD INDEX `idx_handle_time` (`handle_type`, `create_time`);
2.執行計畫
id select_type table type possible_keys key key_len ref rows Extra ------ ----------- --------------------------- ------ -------------------------------- --------------- ------- ------ ------ -------------------------------------------------------- 1 PRIMARY <derived2> ALL (NULL) (NULL) (NULL) (NULL) 2 (NULL) 2 DERIVED room_break_history_tmp_test range idx_from_user_id,idx_handle_time idx_handle_time 7 (NULL) 1 Using index condition; Using temporary; Using filesort
3.執行時間
Execution Time : 0.178 sec
Transfer Time : 0 sec
Total Time : 0.179 sec
## ##### ##### ##### ##### ###
以上是分享一篇mysql優化的實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!