Mysql优化提高笔记整理,来自于一位鹅厂大佬的笔记

在表的设计中一定条件下要满足三范式,表的范式,是首先符合第一范式, 才能满足第二范式 , 进一步满足第三范式。

第一范式: 即表的列的具有原子性,不可再分解,即列的信息,不能分解, 只有数据库是关系型数据库(mysql/oracle/db2/sql server),就自动的满足第一范式。

第二范式: 表中的记录是唯一的, 就满足第二范式, 通常我们设计一个主键来实现。

第三范式: 即表中不要有冗余数据, 就是说,表的信息,如果能够被推导出来,就不应该单独的设计一个字段来存放. 比如下面的设计就是不满足第三范式:

11561958-9b8ba5298a8450fb

表1存在冗余表2的数据,正常的设计都会设计成如下:

11561958-0440d7ef643de6a5

注意: 反第三范式: 但是没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。具体做法是:在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,允许冗余。

在1对N的情况下,为了提高查询的效率,是允许部分字段冗余的。

Sql优化

Sql的优化中,主要是对字段添加索引,主要包含有这四种索引(主键索引/唯一索引/全文索引/普通索引)

1.主键索引添加

当一张表,把某个列设为主键的时候,则该列就是主键索引,下面的id 列就是主键索引

create table user

(id int unsigned primary key auto_increment ,

name varchar(32) not null defaul ‘’);

如果你创建表时,没有指定主键索引,也可以在创建表后,在添加, 指令:

alter table 表名 add primary key (列名);

//举例

alter table user add primary key (id);

2.普通索引

一般来说,普通索引的创建,是先创建表,然后在创建普通索引

比如:

create table user(

id int unsigned,

name varchar(32)

)

create index 索引名 on 表 (列1,列名2);

3.创建全文索引

全文索引,主要是针对对文件,文本的检索, 比如文章, 全文索引针对MyISAM有用。创建如下:

CREATE TABLE articles (

id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,

title VARCHAR(200),

body TEXT,

FULLTEXT (title,body)

)engine=myisam charset utf8;

如何使用全文索引:

select * from articles where body like ‘%非科班%’; //不会使用到全文索引

// 查看是否使用索引:

explain select * from articles where body like ‘%非科班%’

// 正确的用法是:

select * from articles where match(title,body) against(‘非科班’);

说明:

  1. 在mysql中fulltext 索引只针对 myisam生效

  2. mysql自己提供的fulltext针对英文生效->sphinx (coreseek) 技术处理中文

  3. 使用方法是match(字段名…) against(‘关键字’)

  4. 全文索引一个 叫 停止词, 因为在一个文本中,创建索引是一个无穷大的数,因此,对一些常用词和字符,就不会创建,这些词,称为停止词.

4.唯一索引

当表的某列被指定为unique约束时,这列就是一个唯一索引

// 创建

create table user(id int primary key auto_increment , name varchar(32) unique);

这时, name 列就是一个唯一索引,unique字段可以为NULL,并可以有多NULL, 但是如果是具体内容,则不能重复,主键字段,不能为NULL,也不能重复。

创建唯一索引

create table user(id int primary key auto_increment, name varchar(32));

create unique index 索引名 on 表名 (列表…);

查询索引

desc 表名 //不能够显示索引名

show index(es) from 表名

show keys from 表名

删除索引

alter table 表名 drop index 索引名;

//如果删除主键索引。

alter table 表名 drop primary key

索引使用的注意事项

由于索引本身很大,占用磁盘空间,对dml操作有影响,变慢,满足以下条件的字段,才应该创建索引。

  1. 肯定在where条经常使用

  2. 该字段的内容不是唯一的几个值

  3. 字段内容不是频繁变化

explain 可以帮助我们在不真正执行某个sql语句时,就执行mysql怎样执行,这样利用我们去分析sql指令。

11561958-14ba3bdf5031e8ab

  1. id:查询的序列号。

  2. select_type:查询类型。

  3. table:查询表名。

  4. type:扫描方式,all表示全表扫描。

  5. possible_keys:可是使用到的索引。

  6. key:实际使用到的索引。

  7. rows:该sql扫面了多少行。

  8. Extra:sql语句额外的信息,比如排序方式

sql语句的小技巧

  1. 在使用group by 分组查询时,默认分组后,还会排序,可能会降低速度,在group by 后面增加 order by null 就可以防止排序。如下图所示

11561958-9ea461dccaf9185e

  1. 有些情况下,可以使用连接来替代子查询。因为使用join,MySQL不需要在内存中创建临时表。

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
]

[外链图片转存中…(img-2XA3k9xb-1715847124270)]

[外链图片转存中…(img-6Yh5ipRo-1715847124270)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值