MySql速查手册

时间:2022-01-16 01:37:21

索引
定义
索引类型
索引注意事项
事务隔离级别
read uncommitted 未提交读
read committed 提交读
repeatable 重复读
Serializable可串行化
隔离界别查询
数据库锁
数据类型
INT
varchar
时间类型
Java对应Mysql类型
常用函数
常用Sql
存储引擎
InnoDB
MyISAM
知识点
最左匹配原则
=和in可以乱序
单表
尽量not null
业务常见问题
特殊字符插入问题 toc

索引

定义

索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B树的形式保存。就像是数据的目录。

索引类型

唯一索引
主键索引
B-Tree
普通索引
R-Tree
联合索引
Hash
全文索引
FullText
在mysql中fulltext索引只针对myisam生效。
符合索引
对于创建的多列索引(复合索引),不是使用第一部分就不会使用索引。
对于like查询前面%通配符不会使用索引,通配符在后面会使用索引。
使用or要求所有字段都必须有索引,否则不会使用索引。

索引注意事项

#避免使用双%号的查询条件。
如a like ‘3%‘,(如果无前置%,只有后置%,是可以用到列上的索引的)

事务隔离级别

read uncommitted 未提交读

所有事务都可以看到没有提交事务的数据。是所有隔离级别中最低的一种,会出现脏读。
脏读
那就是我们在一个事务中可以随随便便读取到其他事务未提交的数据,这还是比较麻烦的,我们叫脏读。

read committed 提交读

事务成功提交后才可以被查询到。
不可重复读
那就是我们在会话B同一个事务中,读取到两次不同的结果。这就造成了不可重复读,就是两次读取的结果不同。这种现象叫不可重复读。

repeatable 重复读

同一个事务多个实例读取数据时,可能将未提交的记录查询出来,而出现幻读。
mysql默认级别,一个事物中数据一致。

Serializable可串行化

强制的进行排序,在每个读读数据行上添加共享锁。会导致大量超时现象和锁竞争。

隔离界别查询

1.查看当前会话隔离级别
select @@tx_isolation;
2.查看系统当前隔离级别
select @@global.tx_isolation;
3.设置当前会话隔离级别
set session transaction isolatin level repeatable read;
4.设置系统当前隔离级别
set global transaction isolation level repeatable read;

数据库锁

锁粒度
表级锁
行级锁
页级锁
锁级别
共享锁
排它锁
加锁方式
自动锁
显示锁
操作
DML DDL锁
使用方式
乐观锁

update test_innodb set money=123,version=0 1 where version=0 and id=2;

悲观锁

数据类型

INT

1.BIT[M]
位字段类型,M表示每个值的位数,范围从1到64,如果M被忽略,默认为1
2.TINYINT[(M)] [UNSIGNED] [ZEROFILL] M默认为4
很小的整数。带符号的范围是-128到127。无符号的范围是0到255。
3. BOOL,BOOLEAN
是TINYINT(1)的同义词。zero值被视为假。非zero值视为真。
4.SMALLINT[(M)] [UNSIGNED] [ZEROFILL] M默认为6
小的整数。带符号的范围是-32768到32767。无符号的范围是0到65535。
5.MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL] M默认为9
中等大小的整数。带符号的范围是-8388608到8388607。无符号的范围是0到16777215。
6. INT[(M)] [UNSIGNED] [ZEROFILL] M默认为11
普通大小的整数。带符号的范围是-2147483648到2147483647。无符号的范围是0到4294967295。
7.BIGINT[(M)] [UNSIGNED] [ZEROFILL] M默认为20
大整数。带符号的范围是-9223372036854775808到9223372036854775807。无符号的范围是0到18446744073709551615。
注意:这里的M代表的并不是存储在数据库中的具体的长度,以前总是会误以为int(3)只能存储3个长度的数字,int(11)就会存储11个长度的数字,这是大错特错的。
其实当我们在选择使用int的类型的时候,不论是int(3)还是int(11),它在数据库里面存储的都是4个字节的长度,在使用int(3)的时候如果你输入的是10,会默认给你存储位010,也就是说这个3代表的是默认的一个长度,当你不足3位时,会帮你不全,当你超过3位时,就没有任何的影响。

varchar

4.0版本以下,varchar(100),指的是100字节,如果存放UTF8汉字时,只能存33个(每个汉字3字节)
5.0版本以上,varchar(100),指的是100字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放100个。
UTF8编码中一个汉字(包括数字)占用3个字节
GBK编码中一个汉字(包括数字)占用2个字节

时间类型

date yyyy-mm-dd 日期值
time hh:mm:ss 时间值
year yyyy 年份
datetime yyyy-mm-dd hh:mm:ss 日期
timestamp yyyymmddhhmmss 日期

Java对应Mysql类型

Java 类型 SQL 类型
int : java.lang.Integer INTEGER
long : java.lang.Long BIGINT
short : java.lang.Short SMALLINT
float : java.lang.Float FLOAT
double : java.lang.Double DOUBLE
java.math.BigDecimal : NUMERIC
java.lang.String :VARCHAR
byte : java.lang.Byte TINYINT
boolean :java.lang.Boolean bit(值为0或1)
date : LocalDate
time : LocalTime
timestamp : LocalDateTime

常用函数

#find_in_set
like是广泛的模糊匹配,字符串中没有分隔符,find_in_set是精确匹配,字段值以英文”,”分隔,FIND_IN_SET(str,strlist)。 假如字符串str 在由N 子链组成的字符串列表strlist 中,则返回值的范围在 1 到 N 之间
SELECT * from video where find_in_set(‘4‘,week);

常用Sql

#性能查询,用于检测瓶颈,查看执行和拥堵情况
SHOW PROCESSLIST
#分析工具
explain sql
#分步查看sql的最终执行顺序
1 EXPLAIN EXTENDED
SELECT record_start_time AS ‘record_time‘ FROM iindex.iindex_object_audience_analysis_red_black_natural_cycle WHERE record_start_time >= ‘2019-04-15‘ 
AND record_start_time <= ‘2019-06-24‘ ;
2 SHOW WARNINGS;
#强制使用索引
mysql强制使用索引:force index(索引名或者主键PRI)
#查看session是否为自动提交
show variables like "autocommit"
#查看当前数据库的字符集
show variables like ‘%character%‘
#查询索引
show index from 表名
#复制一张表(也可以先用mysqladmin导出数据,再导入)
CREATE TABLE tbl1 LIKE tbl;
INSERT INTO tbl1 SELECT * FROM tbl;
#性能检测
mysql > SET PROFILING = 1;
mysql > ...
mysql > SHOW PROFILES;

存储引擎

InnoDB

适合场景
数据库的增删改查都相当频繁
可靠性要求比较高,要求支持事物

MyISAM

适合场景
频繁执行全表count语句
对数据进行增删改的频率不高,查询非常频繁
没有事物

知识点

最左匹配原则

mysql会一直向右匹配知道遇到范围查询(>,<,between,like)就停止匹配,比如a=3 and b=4 and c>5 and d=4 如果建立abcd的索引,d就用不到索引。

=和in可以乱序

比如a=1 and b=2 and c=3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引认识的形式

单表

#尽量控制单表数据量的大小,建议控制在500万以内
500万并不是MySQL数据库的限制,过大会造成修改表结构,备份,恢复都会有很大的问题
可以用历史数据归档(应用于日志数据),分库分表(应用于业务数据)等手段来控制数据量大小
#限制每张表上的索引数量,建议单张表索引不超过5个
数据库和表的字符集统一使用UTF8
兼容性更好,统一字符集可以避免由于字符集转换产生的乱码,不同的字符集进行比较前需要进行转换会造成索引失效

尽量not null

MYSQL对NULL字段索引优化不佳,增加更多的计算难度,同时在保存与处理NULL类形时,也会做更多的工作,所以从效率上来说,不建议用过多的NULL,解决方法是数值弄用整数0,字符串用空来定义默认值即可。

业务常见问题

特殊字符插入问题

Incorrect string value: ‘xF0x9Fx90xBE‘ for column ‘nick_name‘ at row 1
1 数据库字段编码设置utf8mb4
2 数据库连接设置utf8 
mysql.dev_ifans.url=jdbc:mysql://192.168.32.114:3306/istar_test?autoReconnect=true&characterEncoding=UTF8
3 以上没问题检查数据库连接版本
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>