您的位置:首页 > 职场人生

mysql个人总结(面试使用)

2019-06-11 22:34 344 查看

一.联合索引

1.什么是索引和索引分类:聚集索引和非聚集索引,等同于字典中的按拼音查和按偏旁查

2.什么时候使用索引:外键,where语句后,常使用的查询条件字段。

不适用的:text,image这中大类型的字段。

3.索引限制:最好三个,不超过五个。影响性能

4.索引的有效性:abc三个 ,只有ab,abc才有效用到。中间断开都不行。且不能加范围(<符号使用,失效),最左侧原则

二.分库分表

1.操作:分布式中按照业务和服务分库,分表可以按照手机号的起始字段分或者大表拆分多个小表。

三.事务

1.特性acid:原子性---------- 一个事务中要么全部成功要么全部失败;

一致性---------- 执行事务前后,数据保持一致

隔离性---------- 并发下,事务之前不能相互干扰

持久性---------- 提交后,保存在数据库中,不被该表

2.隔离级别:未提交读 ----------- 两个事务中,一个改变未提交,却被另一个读取到

提交读 ------------ 两个事务中,只有当提交了才能读到。防止脏读

可重复读 ----------- 避免脏读和不可重复读

串行化 -------------- 避免脏读,不可重复读,幻读

3.隔离性造成的几种问题:

脏读:两个事务,一个未提交被另一个读到

不可重复读:一个事务中,读取一个数据的两次结果不一样。别另一个事务在中间间隙修改了

幻读:一个事务中,读取的条数不一样,有另一个事务增加数据了。n-》n+1条

四.基础优化

1.查询:少使用* ,in;

2.建立有效索引,主键和外键加索引

3.分库分表

4.字段的选择,char,varchar等。且长度设置合理

5.硬件设备,网络等。。。

五.存储引擎和字符集选择

1.MyIsAM----非事务安全,锁是针对表级别。Select Count(*) from table 是查条数,不是全表扫描, select多的话用这个;

InnoDB-----并发中事务安全,锁是行级锁。查询统计是全表扫描。update和insert选择

2.字符集:数据库中选择utf8mb4 ,比utf8好,因为支持微信等一些特殊字符;

六.limit

select * from table limit 2,4 查询第三条到第六条,四条数据

七。分布式事物处理

1.补偿事物,在执行失败后,finally中可以补偿

2.后置提交优化,所有事物都完成后一起提交。但是占用太久时间

!!!!!!!!!!!!

spring管理事务:如果一个update里有两个update:1+1模式,本地事务和调用外部事务,可以控制,外层引用失败就可以回滚。但是1+2 三个update时,两个外层事务就不行,因为第三个错,不能控制第二个回滚。

确保事务一直性和逻辑的修改在一条线上,事务就是可以控制的。穿插查询就没问题

八。explain

九.like使用

%name ,%like% 导致索引失效而进行全表扫描,name%是可以的

解决问题是使用全文索引。sql和普通索引sql是不一样的

ALTER TABLE `dynamic_201606` ADD FULLTEXT INDEX `idx_user_name` (`user_name`);

select id,fnum,fdst from dynamic_201606 where match(user_name) against('zhangsan' in boolean mode);

十:db的连接数 https://mp.weixin.qq.com/s/UQ7Pwzr-ZQOXiProEgEw9A

连接数 = 核心数*2 + 有效磁盘数

假设:cup是4核i7,则4*2+1 =9 取值整数10。能够支持3000并发

十一。保持redis和mysql数据一致性

1.写数据时候先落库在更新redis,读的时候强一致性的读mysql;否则redis

2.数据类型差别:实时性高的走库如金额数据。热度排名走redis

事例:多个线程读数据,其中一个删了缓存,正要改数据。使得读取和保持缓存不一样

使用队列,查缓存没有,去队列看有没有待处理任务。然后调换执行逻辑。队列的数据都是执行完删除

十二。dateTime timestamp date time year

year 1bytes YYYY

time 3bytes HH:MM:SS

date 4bytes YYYY-MM-DD

datetime 8bytes YYYY-MM-DD HH:MM:SS 2019-12-12 12:00:00

timestamp 4bytes YYYY-MM-DD HH:MM:SS 时间戳1212121212 但是时间到1970-2038年

 

timestamp 默认入库不能为null,0000-00-00 00:00:00代替。用做更新数据时间

datetime默认入库可谓null;

查询时候时间比较实用![CDATA[]]

<if test="startTime != null and startTime != ''">

    <![CDATA[AND (DATE_FORMAT(c.birthday, '%Y-%m-%d') <= DATE_FORMAT( #{startTime}, '%Y-%m-%d'))]]>

十三。数据库连接池

数据库连接池有dbcp、c3p0、druid

十四。innerDb https://mp.weixin.qq.com/s/3u5_cTv3rls64kJgcpATYA

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: