暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL 索引

liyuan 2024-07-05
32

索引

无论是面试,还是实际工作中,对于一个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 服务器系统变量

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论