mysql学习知识点总结

目录

         1、引擎

2、基础知识

2、sql性能

3、join

4、索引

5、索引优化

6、查询截取分析

7、查询优化

8、mysql设计和优化

9、常用的查询语句

1、查询数据库面表数量

2、查看表信息

3、查看表定义语句

4、删除表

5、修改表(ddl)

6、数据库操作语句(dml)

7、聚合函数

10、查询元数据

11、字符串函数和常用函数

 

12、数值计算函数

13、日期函数

14、流程函数(if ifnull case if else)

15、存储引擎

1、TokuDB

2、innodb和myIsam比较

16、索引

1、索引

17、视图

18、存储过程和函数

19、触发器

20、sql Mode

21、分区

22、自定义变量

23、sql语言部分

1、sql通用

24、设计规则

1、规则

2、规则2

3、sql语句

25、优秀文章

26、隔离级别

27、设计数据三范式

28、java书写sql问题

29、日常书写sql小优化


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、规则

  1. 任何字段如果为非负数,必须是unsigned

  2. 【强制】主键索引名为pk字段名;唯一索引名为uk字段名;普通索引名则为idx_字段名。

说明:pk_ 即primary key;uk_ 即 unique key;idx_ 即index的简称。

3.【强制】小数类型为decimal,禁止使用float和double。

说明:float和double在存储的时候,存在精度损失的问题,很可能在值的比较时,得到不

正确的结果。如果存储的数据范围超过decimal的范围,建议将数据拆成整数和小数分开存储。

2、规则2

  1. 【强制】如果存储的字符串长度几乎相等,使用char定长字符串类型。

  2. 【强制】varchar是可变长字符串,不预先分配存储空间,长度不要超过5000,如果存储长度大于此值,定义字段类型为text,独立出来一张表,用主键来对应,避免影响其它字段索引效率。

  3. 【强制】表必备三字段:id, gmt_create, gmt_modified。

    说明:其中id必为主键,类型为unsigned bigint、单表时自增、步长为 1。gmt_create, gmt_modified的类型均为date_time类型,前者现在时表示主动创建,后者过去分词表示被动更新。

  4. 合适的字符存储长度,不但节约数据库表空间、节约索引存储,更重要的是提升检索速度

3、sql语句

  1. count(*)会统计值为NULL的行,而count(列名)不会统计此列为NULL值的行

  2. 【强制】使用ISNULL()来判断是否为NULL值。

    说明:NULL与任何值的直接比较都为NULL。

    1) NULL<>NULL的返回结果是NULL,而不是false。

    2) NULL=NULL的返回结果是NULL,而不是true。

    3) NULL<>1的返回结果是NULL,而不是true。

    1. 【强制】 在代码中写分页查询逻辑时,若count为0应直接返回,避免执行后面的分页语句。

    2. 【强制】不得使用外键与级联,一切外键概念必须在应用层解决。

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避免一次操作很多数据

猜你喜欢

转载自blog.csdn.net/qq_27038577/article/details/115164710