最后
如果觉得本文对你有帮助的话,不妨给我点个赞,关注一下吧!
分析语句查询
在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并发体系思维导图,希望对你有所帮助。
想脱离传统行业,这些技术知识都是你必备的,下面自己手打了一份Java并发体系思维导图,希望对你有所帮助。
[外链图片转存中…(img-P5ye87zu-1715676571659)]