索引
无论是面试,还是实际工作中,对于一个Java程序员来说,数据库优化是避不开的一个技术点,关于数据库的优化,在性能达不到要求的情况下,我大致给出以下几个方向:
(1)优化表结构,对常用字段和非常用的字段分开存储
(2)优化SQL,合理使用索引
(3)做数据库读写分离,减少IO压力,由于数据库对记录做了持久化并存储在磁盘上,对磁盘的I/O又是非常消耗性能的操作,因此读、写都在一个库中会大大增加I/O的压力
(4)尝试使用缓存,不要让数据都走数据库
(5)对业务做垂直拆分
(6)对表做水平拆分,这一步比较麻烦,要注意主键生成规则以及请求路由规则
以上6个点是有优先级的,本文关注的是第二点的索引部分。正确合理地使用索引对于数据库性能提升是至关重要的,本文暂时不分析索引原理,只是从实战的角度,总结一下索引的使用技巧,理论结合实践,印象会更深一些。
我相信乔布斯说的,只有那些疯狂到认为自己可以改变世界的人才能真正地改变世界。面对压力,我可以挑灯夜战、不眠不休;面对困难,我愿意迎难而上、永不退缩。
其实我想说的是,我只是一个程序员,这就是我现在纯粹人生的全部。
DROP TABLE IF EXISTS `students`;CREATE TABLE `students` ( `s_id` int(11) NOT NULL AUTO_INCREMENT, `s_name` varchar(100) DEFAULT NULL, `s_age` int(11) DEFAULT NULL, `s_phone` varchar(30) DEFAULT NULL, PRIMARY KEY (`s_id`), KEY `s_name` (`s_name`)) ENGINE=InnoDB, CHARSET=utf8;
CREATE FUNCTION `rand_string`(n INT) RETURNS varchar(255) CHARSET latin1BEGIN DECLARE chars_str varchar(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; DECLARE return_str varchar(255) DEFAULT '' ;DECLARE i INT DEFAULT 0; WHILE i < n DO SET return_str = concat(return_str,substring(chars_str , FLOOR(1 + RAND()*62 ),1)); SET i = i +1; END WHILE; RETURN return_str; END
CREATE PROCEDURE `add_student_memory`(IN n int)BEGIN DECLARE i INT DEFAULT 1; WHILE (i <= n ) DO INSERT into students (s_name, s_age, s_phone) VALUEs (rand_string(20), FLOOR(RAND() * 100), FLOOR(RAND() * 100000));set i=i+1; END WHILE;END
4、调用存储过程CALL add_student_memory(5000000) // 50万数据
无论是面试,还是实际工作中,对于一个Java程序员来说,数据库优化是避不开的一个技术点,关于数据库的优化,在性能达不到要求的情况下,我大致给出以下几个方向:
(1)优化表结构,对常用字段和非常用的字段分开存储
(2)优化SQL,合理使用索引
(3)做数据库读写分离,减少IO压力,由于数据库对记录做了持久化并存储在磁盘上,对磁盘的I/O又是非常消耗性能的操作,因此读、写都在一个库中会大大增加I/O的压力
(4)尝试使用缓存,不要让数据都走数据库
(5)对业务做垂直拆分
(6)对表做水平拆分,这一步比较麻烦,要注意主键生成规则以及请求路由规则
以上6个点是有优先级的,本文关注的是第二点的索引部分。正确合理地使用索引对于数据库性能提升是至关重要的,本文暂时不分析索引原理,只是从实战的角度,总结一下索引的使用技巧,理论结合实践,印象会更深一些。
- 从 MySQL 9.0.0 开始可以保存 EXPLAIN ANALYZE INTO 的 JSON 输出,语法如下:
EXPLAIN ANALYZE FORMAT=JSON INTO @variable select_stmt 注意:只有当 explain_json_format_version 系统变量设置为 2 时,此特性才可用.
复制
从 MySQL 9.0.0 开始,‘CREATE EVENT’、‘ALTER EVENT’、‘DROP EVENT’ DDL event 可以作为 PREPARE 阶段执行。
从 MySQL 9.0.0 开始,添加两个 Performance Schema 系统变量表。
variables_metadata:提供了关于系统变量的一般信息。这些信息包括 MySQL 服务器识别的每个系统变量的名称、作用域、类型、范围(如适用)和描述。该表中的两个列(MIN_VALUE 和 MAX_VALUE)用于替换 variables_info 表中已弃用的列。
global_variale_attributes:提供了关于服务器分配给全局系统变量的属性值对的信息。
从 MySQL 9.0.0 开始,“mysql_native_password” 插件已经被删除,如果客户端软件不具备“CLIENT_PLUGIN_AUTH”能力将无法连接服务器。为了向后兼容,mysql_native_password 在客户端仍然可用,以便 MySQL 9.0 客户端程序可以连接到早期版本的 MySQL 服务器。在MySQL 9.0中,MySQL原生身份验证插件已经被转换为必须在运行时加载的插件。
由于这一变化,以下服务器参数和变量也被删除:
–mysql-native-password 服务器选项
–mysql-native-password-proxy-users 服务器选项
default_authentication_plugin 服务器系统变量