最新深入探究MySql的性能优化,助力你的开发实战(1),Java高级面试题

更多:Java进阶核心知识集

包含:JVM,JAVA集合,网络,JAVA多线程并发,JAVA基础,Spring原理,微服务,Zookeeper,Kafka,RabbitMQ,Hbase,MongoDB,Cassandra,设计模式,负载均衡,数据库,一致性哈希,JAVA算法,数据结构,加密算法,分布式缓存等等

image

高效学习视频

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

增加中间表

有时需要经常查询某两个表中的几个字段。如果经常进行联表查询,会降低MySQL数据库的查询速度。对于这种情况,可以建立中间表来提高查询速度。

先分析经常需要同时查询哪几个表中的哪些字段,然后将这些字段建立一个中间表,并将原来那几个表的数据插入到中间表中,之后就可以使用中间表来进行查询和统计。

实际中经常要查学生的学号、姓名和成绩。根据这种情况可以创建一个temp_score表。temp_score表中存储3个字段,分别是id、name和grade。CREATE语句执行如下:

CREATE TABLE temp_score(

id INT NOT NULL,

Name VARCHAR(20)NOT NULL,

grade FLOAT);

然后从student表和score表中将记录导入到temp_score表中。INSERT语句如下:

INSERT INTO temp_score SELECT student.id, student.name, score.grade

FROM student, score WHERE student.id=score.stu_id;

将这些数据插入到temp_score表中以后,可以直接从temp_score表中查询学生的学号、姓名和成绩。这样就省去了每次查询时进行表连接,从而提高数据库的查询速度。

优化插入记录的速度

插入记录时,索引、唯一性校验都会影响到插入记录的速度;而且一次插入多条记录和多次插入记录所耗费的时间是不一样的。根据这些情况,分别进行不同的优化。

1.禁用索引

插入记录时,MySQL会根据表的索引对插入的记录进行排序。如果插入大量数据时,这些排序会降低插入记录的速度。为了解决这种情况,在插入记录之前先禁用索引,等到记录都插入完毕后再开启索引。禁用索引的语句如下:

ALTER TABLE 表名 DISABLE KEYS;

重新开启索引的语句如下:

ALTER TABLE 表名 ENABLE KEYS;

对于新创建的表,可以先不创建索引,等到记录都导入以后再创建索引,这样可以提高导入数据的速度。

2.禁用唯一性检查

插入数据时,MySQL会对插入的记录进行校验。这种校验也会降低插入记录的速度,可以在插入记录之前禁用唯一性检查,等到记录插入完毕后再开启。禁用唯一性检查的语句如下:

SET UNIQUE_CHECKS=0;

重新开启唯一性检查的语句如下:

SET UNIQUE_CHECKS=1;

3.优化INSERT语句

插入多条记录时,可以采取两种写INSERT语句的方式。第一种是一个INSERT语句插入多条记录。INSERT语句的情形如下:

INSERT INTO food VALUES

(NULL,‘果冻’,‘CC果冻厂’,1.8,‘2009’,‘北京’),

(NULL,‘咖啡’,‘CF咖啡厂’,25,‘2010’,‘天津’),

(NULL,‘奶糖’,‘旺仔奶糖’,15,‘2011’,‘广东’);

第二种是一个INSERT语句只插入一条记录,执行多个INSERT语句来插入多条记录。INSERT语句的情形如下:

INSERT INTO food VALUES(NULL,‘果冻’,‘CC果冻厂’,1.8,‘2009’,‘北京’);

INSERT INTO food VALUES(NULL,‘咖啡’,‘CF咖啡厂’,25,‘2010’,‘天津’);

INSERT INTO food VALUES(NULL,‘奶糖’,‘旺仔奶糖’,15,‘2011’,‘广东’);

第一种方式减少了与数据库之间的连接等操作,其速度比第二种方式要快。

ps:当插入大量数据时,建议使用一个INSERT语句插入多条记录的方式;而且如果能用LOAD DATA INFILE语句,就尽量用LOAD DATA INFILE语句,因为LOAD DATA INFILE语句导入数据的速度比INSERT语句的速度快。

分析表、检查表和优化表

分析表主要作用是分析关键字的分布;检查表主要作用是检查表是否存在错误;优化表主要作用是消除删除或者更新造成的空间浪费。

1.分析表

MySQL中使用ANALYZE TABLE语句来分析表,该语句的基本语法如下:

analyze table 表名1,表名2……;

使用analyze table分析表的过程中,数据库系统会对表加一个只读锁,在分析期间,只能读取表中的记录,不能更新和插入记录。ANALYZE TABLE语句能够分析InnoDB和MyISAM类型的表。

详细介绍如下:

Table:表示表的名称;

Op:表示执行的操作。analyze表示进行分析操作;check表示进行检查查找;optimize表示进行优化操作;

Msg_type:表示信息类型,其显示的值通常是状态、警告、错误和信息这四者之一;

Msg_text:显示信息。

检查表和优化表之后也会出现这4列信息。

2.检查表

MySQL中使用CHECK TABLE语句来检查表。CHECK TABLE语句能够检查InnoDB和MyISAM类型的表是否存在错误;而且,该语句还可以检查视图是否存在错误。该语句的基本语法如下:

check table 表名1,表名2…… [option];

其中,option参数有5个参数,分别是QUICK、FAST、CHANGED、MEDIUM和EXTENDED。这5个参数的执行效率依次降低。option选项只对MyISAM类型的表有效,对InnoDB类型的表无效。CHECK TABLE语句在执行过程中也会给表加上只读锁。

3.优化表

MySQL中使用optimize table语句来优化表。该语句对InnoDB和MyISAM类型的表都有效。但是,optimize table只能优化表中的VARCHAR、BLOB或TEXT类型的字段。optimize table语句的基本语法如下:

optimize table 表名1,表名2……;

通过optimize table语句可以消除删除和更新造成的磁盘碎片,从而减少空间的浪费。OPTIMIZE TABLE语句在执行过程中也会给表加上只读锁。

ps:如果一个表使用了TEXT或者BLOB这样的数据类型,那么更新、删除等操作就会造成磁盘空间的浪费,因为,更新和删除操作后,以前分配的磁盘空间不会自动收回。使用optimize table语句就可以将这些磁盘碎片整理出来,以便以后再利用。

查询高速缓存


在MySQL中,用户通过SELECT语句查询数据时,该操作将结果集保存到一个特殊的高级缓存中,从而实现查询操作。首次查询后,当用户再次做相同查询操作时,MySQL即可从高速缓存中检索结果。这样一来,既提高了查询效率,同样起到优化查询的作用。

检验高速缓存是否开启

SHOW VARIABLES LIKE’%query_cache%';

主要的参数进行说明:

have_query_cache:表明服务器在默认安装条件下,是否已经配置查询高速缓存。

query_cache_size:高速缓存分配空间,如果该空间为86,则证明分配给高速缓存空间的大小为86MB。如果该值为0,则表明查询高速缓存已经关闭。

query_cache_type:判断高速缓存开启状态,其变量值范围为0~2。其中,当该值为0或OFF时,表明查询高速缓存已经关闭;当该值为1或ON时,表明高速缓存已经打开;其值为2或DEMAND时,表明要根据需要运行有SQL_CACHE选项的SELECT语句,提供查询高速缓存。

使用高速缓存

在MySQL中,查询高速缓存的具体语法结构如下:

SELECT SQL_CACHE * FROM 表名;

总结

我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。

面试题多多少少对于你接下来所要做的事肯定有点帮助,但我更希望你能透过面试题去总结自己的不足,以提高自己核心技术竞争力。每一次面试经历都是对你技术的扫盲,面试后的复盘总结效果是极好的!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

总结自己的不足,以提高自己核心技术竞争力。每一次面试经历都是对你技术的扫盲,面试后的复盘总结效果是极好的!

[外链图片转存中…(img-wkq5d0Hs-1715676534536)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值