最新深入探究MySql的性能优化,助力你的开发实战,java线程池面试题思否

最后

如果觉得本文对你有帮助的话,不妨给我点个赞,关注一下吧!

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

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

分析语句查询

在MySQL中,可以使用EXPLAIN语句和DESCRIBE语句来分析查询语句。

应用EXPLAIN关键字分析查询语句,其语法结构如下:

EXPLAIN SELECT语句;

EXPLAIN|DESCRIBE SELECT * FROM timeinfo;

其中,各字段所代表的意义如下所示:

id列:指定在整个查询中SELECT的位置。

table列:存放查询的表名。

type列:连接类型,该列中存储很多值,范围从const到ALL。

possible_keys列:指定为了提高查找速度,在MySQL中可以使用的索引。

key列:指定实际使用的键。

rows列:指定MySQL需要在相应表中返回查询结果所检验的行数,为了得到该总行数,MySQL必须扫描处理整个查询,再乘以每个表的行值。

Extra列:包含一些其他信息,设计MySQL如何处理查询。

索引对查询速度的影响

在查询过程中使用索引,势必会提高数据库查询效率,应用索引来查询数据库中的内容,可以减少查询的记录数,从而达到优化查询的目的。

使用索引查询

在MySQL中,索引可以提高查询的速度,但并不能充分发挥其作用,所以在应用索引查询时,也可以通过关键字或其他方式来对查询进行优化处理。

1.应用LIKE关键字优化索引查询

如果匹配字符串中,第一个字符为百分号“%”时,索引不会被使用,如果“%”所在匹配字符串中的位置不是第一位置,则索引会被正常使用。

2.查询语句中使用多列索引

多列索引是指在表的多个字段上创建一个索引,当且仅当只有查询条件中使用了这些字段中的一个字段时,索引才会被正常使用。

应用多列索引在表的多个字段中创建一个索引,其命令如下:

CREATE INDEX index_student_info ON studentinfo(name, sex);

ps:在应用sex字段时,索引不能被正常使用。这就意味着索引并未在MySQL优化中起到任何作用,故必须使用第一字段name时,索引才可以被正常使用。

3.查询语句中使用OR关键字

在MySQL中,查询语句只有包含OR关键字时,要求查询的两个字段必须同为索引,如果所搜索的条件中,有一个字段不为索引,则在查询中不会应用索引进行查询。其中,应用OR关键字查询索引的命令如下: SELECT * FROM studentinfo WHERE name=‘Chris’ or sex=‘M’;

优化数据库结构


数据库结构是否合理,需要考虑是否存在冗余、对表的查询和更新的速度、表中字段的数据类型是否合理等多方面的内容。

将字段很多的表分解成多个表

有些表在设计时设置了很多的字段。这个表中有些字段的使用频率很低。当这个表的数据量很大时,查询数据的速度就会很慢。对于这种字段特别多且有些字段的使用频率很低的表,可以将其分解成多个表。

学生表中有很多字段,其中在extra字段中存储着学生的备注信息。有些备注信息的内容特别多,但是,备注信息很少使用。这样就可以分解出另外一个表。将这个取名为student_extra的表中存储两个字段,分别为id和extra。其中,id字段为学生的学号,extra字段存储备注信息。如果需要查询某个学生的备注信息,可以用学号(id)来查询。如果需要将学生的学籍信息与备注信息同时显示时,可以将student表和student_extra表进行联表查询,查询语句如下:

SELECT*FROM student, student_extra WHERE student.id=student_extra.id;

通过这种分解,可以提高student表的查询效率。因此,遇到这种字段很多,而且有些字段使用不频繁的,可以通过这种分解的方式来优化数据库的性能。

增加中间表

有时需要经常查询某两个表中的几个字段。如果经常进行联表查询,会降低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语句的速度快。

分析表、检查表和优化表

最后

现在其实从大厂招聘需求可见,在招聘要求上有高并发经验优先,包括很多朋友之前都是做传统行业或者外包项目,一直在小公司,技术搞的比较简单,没有怎么搞过分布式系统,但是现在互联网公司一般都是做分布式系统。

所以说,如果你想进大厂,想脱离传统行业,这些技术知识都是你必备的,下面自己手打了一份Java并发体系思维导图,希望对你有所帮助。

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

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

想脱离传统行业,这些技术知识都是你必备的,下面自己手打了一份Java并发体系思维导图,希望对你有所帮助。

[外链图片转存中…(img-P5ye87zu-1715676571659)]

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值