目录
14、流程函数(if ifnull case if else)
1、引擎
innoDB:行级锁,支持事务,适合于分布式的环境
MYISAM:更加读数据,表锁,不支持事务,不适合分布式,性能更高
NDB存储索引:集群存储引擎,主键查找速度快
Memory:数据是放在内存的,采用哈希索引
2、基础知识
1、int(5)和int(10)本质没有区别
只是对于宽度进行了限制,超过宽度也不会有影响
2、时间类型:
date(默认为年月日) datetime(年月日时分秒) timestamp(类型datetime,但是受时区影响) time(时分秒) year
3、日期
4、字符串
5、set
6、枚举
7、SQL_MODE的设置
SET sql_mode ='ONLY_FULL_GROUP_BY'
SELECT * FROM category_ GROUP BY ID -- 设置之后就不能这样写
SELECT * FROM category_ GROUP BY ID -- 不设置可以写,返回第一行数据,但是在oracle中不行
8、正则表达式
select 'abcdef' REGEXP 'ab','abcdefg' REGEXP 'k' --- 1,0
2、sql性能
查询语句慢
索引失效
3、join
select i1.,i. from index_id i LEFT JOIN index1 i1 on i.id = i1.id where i1.id is NULL
4、索引
1、单值索引、唯一索引、复合索引
索引是帮助mysql高效获取数据的数据结构
本质:索引就是数据结构,排好序的快速查找数据结构
2、索引结构
btree索引、hash索引、full-text索引、R-tree索引
3、索引适合建立情况
-
主键自动建立唯一索引;
-
频繁作为查询条件的字段应该创建索引;
-
查询中与其他表关联的字段,外键关系建立索引;
-
频繁更新的字段不适合创建索引;
-
WHERE 条件里用不到的字段不要创建索引;
-
高并发情况下,倾向创建组合索引;
-
查询中排序的字段,排序字段若通过索引去访问将大大提高索引速度;
-
查询中统计或者分组字段
5、索引优化
1、使用!=或者<>的时候无法使用索引时候导致全表扫描
2、is null ,is not null也无法使用
3、like以通配符(‘%abc%’)nysql索引也会失效,全表扫描(like “july%”这种可以,也可以使用覆盖索引)
4、发生隐形的数据类型转换
5、少用or,用它连接时索引失效
6、全值配置
7、最佳左前缀法则
8、不在索引上做任何操作
9、尽量使用覆盖索引,减少select *
6、查询截取分析
永远小表驱动大表,例如:可以使用exites替换in
select * from A where id in (select id from b)
7、查询优化
8、mysql设计和优化
SQL性能优化的目标:至少要达到 range 级别,要求是ref级别,如果可以是consts 最好。说明:
1、https://www.kancloud.cn/thinkphp/mysql-design-optimalize/39320
2、大量插入数据的时候,可以关闭索引
-- 关闭:
ALTER TABLE user_info DISABLE KEYS;
-- 开启:
ALTER TABLE user_info ENABLE KEYS;
9、常用的查询语句
1、查询数据库面表数量
SELECT COUNT(*) TABLES, table_schema FROM information_schema.TABLES GROUP BY table_schema;
2、查看表信息
desc opu_om_org;
3、查看表定义语句
show create table opu_om_org;
4、删除表
drop table opu_om_user;
5、修改表(ddl)
alter table tablename modify column_definition
--- 修改表类型
alter table emp modify ename varchar(20)
--- 增加字段
alter table emp add column age int(2)
---删除子弹
alter table emp drop column age
---- 字段改变名字
alter table emp change age age1 int(4)
---更高表名字
alter table emp rename emp1;
6、数据库操作语句(dml)
1、一次插入多条数据
insert into emp values(1,'111',2),(2,'222',22)
2、一次删除多个表的数据
delete a,b from emp a, dept b where a.id=b.id
7、聚合函数
10、查询元数据
1、information_schema
可以在表里面查询数据的表、视图等等数据信息
11、字符串函数和常用函数
length()
select RIGHT(filename, INSTR(REVERSE(filename),'.')) -- 取文件名字后缀
select INSTR('.pdfvcc','c') -- 去字符串的位置
group_concat(id order by id desc) -- 做排序
-- 问题 group_concat默认长度为1024,太长的话,会被截断
1、修改配置文件
-- group_concat_max_len = 5120
2、设置,重启会失效
-- SET GLOBAL group_concat_max_len=5120;
-- SET SESSION group_concat_max_len=5120;
12、数值计算函数
13、日期函数
date_format(now(),'%Y-%m-%d %T') -- 日期格式化
UPDATE ETL_JOB SET START_TIME = STR_TO_DATE('${end_time}', '%Y-%m-%d %H:%i:%s'),END_TIME = now() WHERE JOB_ID = '1' -- 字符转为日期
14、流程函数(if ifnull case if else)
-- if在where中使用
select * from opu_om_user where user_name like '%青海%'
and login_name=if(login_name='qhsdzj3','qhsqxj','qhsqxj1')
-- case 用在where的条件查询中
select * from opu_om_user where user_name like '%青海%'
and login_name = ( case login_name when 'qhszrzyt3' then 'qhsdzj1'
else 'qhsdzj'
end
)
select case (select 1 ) when (select 2 ) then (select 3) else (select 4)
15、存储引擎
默认常用的为innodb、myISAM、memory、merge、TokuDB
1、TokuDB
适用于写多读少的场景,拥有出色的数据压缩功能
2、innodb和myIsam比较
-
事务
innodb支持事务处理,可以使用commit和roolback语句
-
并发
myisam支持表级锁,innodb支持行级锁
-
外键
innodb支持外键,myisam不支持外键
-
其他特性
myisam支持压缩数据和表空间,所有操作的时间速度比较快,innodb对于数据操作比较安全,但是速度会比较慢
-
备份
innodb支持在线热备份
16、索引
1、索引
B+tree索引、哈希索引、全文索引、空间数据索引
2、索引优化
17、视图
1、创建
create or REPLACE view table_view AS
select v1.id,v2.name from view1 v1 ,view2 v2 where v1.id = v2.id
18、存储过程和函数
19、触发器
20、sql Mode
21、分区
22、自定义变量
SET @row_number = 0;
SELECT
(@row_number:=@row_number + 1) AS id
, name1, desc1
FROM
aa
LIMIT 5;
23、sql语言部分
1、sql通用
select NOW();
select CURRENT_DATE();
24、设计规则
1、规则
-
任何字段如果为非负数,必须是unsigned
-
【强制】主键索引名为pk字段名;唯一索引名为uk字段名;普通索引名则为idx_字段名。
说明:pk_ 即primary key;uk_ 即 unique key;idx_ 即index的简称。
3.【强制】小数类型为decimal,禁止使用float和double。
说明:float和double在存储的时候,存在精度损失的问题,很可能在值的比较时,得到不
正确的结果。如果存储的数据范围超过decimal的范围,建议将数据拆成整数和小数分开存储。
2、规则2
-
【强制】如果存储的字符串长度几乎相等,使用char定长字符串类型。
-
【强制】varchar是可变长字符串,不预先分配存储空间,长度不要超过5000,如果存储长度大于此值,定义字段类型为text,独立出来一张表,用主键来对应,避免影响其它字段索引效率。
-
【强制】表必备三字段:id, gmt_create, gmt_modified。
说明:其中id必为主键,类型为unsigned bigint、单表时自增、步长为 1。gmt_create, gmt_modified的类型均为date_time类型,前者现在时表示主动创建,后者过去分词表示被动更新。
-
合适的字符存储长度,不但节约数据库表空间、节约索引存储,更重要的是提升检索速度
3、sql语句
-
count(*)会统计值为NULL的行,而count(列名)不会统计此列为NULL值的行
-
【强制】使用ISNULL()来判断是否为NULL值。
说明:NULL与任何值的直接比较都为NULL。
1) NULL<>NULL的返回结果是NULL,而不是false。
2) NULL=NULL的返回结果是NULL,而不是true。
3) NULL<>1的返回结果是NULL,而不是true。
-
【强制】 在代码中写分页查询逻辑时,若count为0应直接返回,避免执行后面的分页语句。
-
【强制】不得使用外键与级联,一切外键概念必须在应用层解决。
-
25、优秀文章
1、数据库知识点:https://juejin.im/post/6883270227078070286
2、mysql优化和设计:https://www.kancloud.cn/thinkphp/mysql-design-optimalize/39320
26、隔离级别
未提交读(READ UNCOMMITTED)
事务中的修改,即使没有提交,对其他事务也是可见的。
提交读(READ COMMITTED)
一个事务只能读取已经提交的事务所做的修改。换句话说,一个事务所做的修改在提交之前对其他事务是不可见的。
可重复读(REPEATABLE READ)
保证在同一个事务中多次读取同样数据的结果是一样的。
可串行化(SERIALIZABLE)
强制事务串行执行。
需要加锁实现,而其它隔离级别通常不需要。
隔离级别 | 脏读 | 不可重复读 | 幻影读 |
---|---|---|---|
未提交读 | √ | √ | √ |
提交读 | × | √ | √ |
可重复读 | × | × | √ |
可串行化 | × | × | × |
27、设计数据三范式
1、属性不可分
2、
28、java书写sql问题
1、使用 where 1=1 and 来避免拼接问题
2、 where 1>2 or
29、日常书写sql小优化
1、inner join 与in 与exists
select * from user where userid in(select userid from user1)
select a.* from A1 a where exists (select 'x' from A2 b where b.column2=xxx and a.column1=b.column1);
delete temp.* from user inner join user1 on user.userid=user1.userid -- 当数据数据量比较大的时候inner join性能优于 in exists
2、使用limit限制
-- 当只要一行数据时使用LIMIT1,或者删除时候
select *from user limit 1;
delete *from user limit 1;-- 可以避免误删除数据
3、千万不要ORDER BY RAND()
-- 你有N种方法可以达到这个目的。这样使用只让你的数据库的性能呈指数级的下降。这里的问题是:MySQL会不得不去执行RAND()函数(很耗CPU时间),而且这是为了每一行记录去记行,然后再对其排序。就算是你用了Limit 1也无济于事(因为要排序)
select *from opu_om_user order by rand() limit 1
4、永远为每张表设置一个ID
5、使用ENUM而不是VARCHAR
-- ENUM类型是非常快和紧凑的。在实际上,其保存的是TINYINT,但其外表上显示为字符串。这样一来,用这个字段来做一些选项列表变得相当的完美。如果你有一个字段,比如“性别”,“国家”,“民族”,“状态”或“部门”,你知道这些字段的取值是有限而且固定的,那么,你应该使用ENUM而不是VARCHAR
6、delete和insert避免一次操作很多数据