1. 硬件的升级:

加内存,cpu(i5—->i7)等等这些升级,其实对于性能的提高作用并不是很大

2. 系统的配置:

修改服务器的配置,使得服务器的性能更加偏重,使得服务器的性能好点
1.通过对bufferpool知识的学习,我们知道,数据库的数据,一部分是在内存中,一部分是在磁盘上。那么我们 也知道数据放在内存中进行交互的话,性能更加的好。(bufferpool里面放尽量多的数据)
方案:调大bufferpool的空间大小,使得bufferpool放下足够多的数据:innodbbuffer_pool_size
![e28ff9abc00d2bf46f0f3901f1c96a63
.jpg](https://cdn.nlark.com/yuque/0/2021/jpeg/2499550/1629607934113-9b1a8892-8dac-452b-994d-143291545b32.jpeg#clientId=ua8f82a7b-1576-4&from=paste&height=98&id=IKkQp&margin=%5Bobject%20Object%5D&name=e28ff9abc00d2bf46f0f3901f1c96a63_.jpg&originHeight=195&originWidth=692&originalType=binary&ratio=1&size=71673&status=done&style=none&taskId=u06d8de93-ce21-4b5d-b5fb-bd2439b471c&width=346)
2.数据预热:数据库重启的时候将磁盘的数据加载到内存中
3.降低磁盘写入次数:
image.png
3、表机构的设计
image.png
2.在表中设计冗余的字段(冗余的字段尽量是不会改的数据):这样就省的联表查询
3.拆表:将字段非常多的表拆开,要不然扫描的时候非常耗时。
4.主键的优化:主键的类型最好是int类型(存储空间小,方便排序):
问题:在分布式环境下,怎么保证表的主键的唯一性:雪花算法:64bit的引入时间戳和自增id的算法:(推荐使用雪花算法)
问题:redis的全局id能解决并发问题,但是在集群模式下会造成数据不一致的问题。
UUID保证了唯一性,但是没有顺序可言
5.字段设计:
1.字段的宽度设计的小一些
2.字段尽量不要设置成not null
3.能用数字的就用数字类型

4. Sql优化以及索引

  1. 避免in里面的值过多,因为mysql对in做了优化,会将in里面的值排序并放入到数组里面去。所以值过多情况下不要使用in
    2. 避免select * 这种写法(消耗带宽,cpu,io,内存)
    3. limit可以阻止全表扫描(分页的时候可以使用)
    4. 排序字段加索引
    5. 如果限制条件中其他字段没有索引,尽量少用or ,or两边的字段中,如果有一个不是索引字段,会造成该查询不走索引的情况。
    6.尽量用union all代替union
    union和union all的差异主要是前者需要将结果集合并后再进行唯一性过滤操作,这就会涉及到排序, 增加大量的CPU运算,加大资源消耗及延迟。当然,union all的前提条件是两个结果集没有重复数据。
    7.不使用ORDER BY RAND()
    ORDER BY RAND() 不走索引

6.union和union all的差异主要是前者需要将结果集合并后再进行唯一性过滤操作,这就会涉及到排序,增加大量的CPU运算,加大资源消耗及延迟。当然,union all的前提条件是两个结果集没有重复数据。
7.区分in和exists、not in和not exists
区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询。所以IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。
关于not in和not exists,推荐使用not exists,不仅仅是效率问题,not in可能存在逻辑问题。如何高效的写出一个替代not exists的SQL语句?

7.分段查询 :一些用户选择页面中,可能一些用户选择的范围过大,造成查询缓慢。主要的原因是扫描行数过多。这个时候可以通过程序,分段进行查询,循环遍历,将结果合并处理进行展示。
不建议使用%前缀模糊查询
例如LIKE“%name”或者LIKE“%name%”,这种查询会导致索引失效而进行全表扫描。但是可以使用LIKE “name%”。
那么如何解决这个问题呢,答案:使用全文索引或ES全文检索
8.避免在where子句中对字段进行表达式操作
9.避免隐式类型转换
where子句中出现column字段的类型和传入的参数类型不一致的时候发生的类型转换,建议先确定where中的参数类型。 where age=’18’
10.对于联合索引来说,要遵守最左前缀法则
举列来说索引含有字段id、name、school,可以直接用id字段,也可以id、name这样的顺序,但是name;school都无法使用这个索引。所以在创建联合索引的时候一定要注意索引字段顺序,常用的查询字段放在最前面。
11.必要时可以使用force index来强制查询走某个索引
有的时候MySQL优化器采取它认为合适的索引来检索SQL语句,但是可能它所采用的
b71e2a9c0a07eb1aef2ed986ab399dc4_.jpg
f5deb5263264569981aefd5d50ed9303_.jpg
fe999cdb44cb3ce051ec829ebe4e2402_.jpg

3119eabe52662fbd5bf3c41dc9affb67_.jpg
02f8c26558ae34ac9ee354e1590a22f9_.jpg