今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于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 keywordtemp3.执行计划
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优化的实例02-28
- MySQL数据表的创建、查看、插入实例详解02-28
- sql判断某个字段是否为空02-28
- mysql锁机制的详细介绍02-28
- 原生JDBC的开发步骤和介绍02-28
- mysql innodb 配置 raw,实现linux下绕过内核缓冲区,实现直接I/O02-28
- pt-osc使用一则02-28
- 用非动态SQL Server SQL语句来对动态查询进行执行详解02-28
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- MySQL数据表的创建、查看、插入实例详解
MySQL数据表的创建、查看、插入实例详解
26-02-28 - 如何实现windows服务器下mysql自动定时备份数据库
如何实现windows服务器下mysql自动定时备份数据库
26-02-28 - MySQL插入数据时遇到中文乱码改怎么办?
MySQL插入数据时遇到中文乱码改怎么办?
26-02-28 - 封装mysql的JDBC该如何操作
封装mysql的JDBC该如何操作
26-02-28 - mysql中table_cache配置参数说明
mysql中table_cache配置参数说明
26-02-28 - SQL Server并发处理存在就更新解决方案探讨_MsSql
SQL Server并发处理存在就更新解决方案探讨_MsSql
26-02-28 - MySQL 数据库 source 命令详解_MsSql
MySQL 数据库 source 命令详解_MsSql
26-02-28 - SQL Server 磁盘请求超时的833错误原因及解决方法_MsSql
SQL Server 磁盘请求超时的833错误原因及解决方法_MsSql
26-02-28 - mysql中替代null的IFNULL()与COALESCE()函数详解_Mysql
- MySQL中两种子查询的写法
MySQL中两种子查询的写法
26-02-28
