结构化查询语言(Structured Query Language)
SQL分类:
数据定义语言DDL(Data Definition Language):create alter drop
数据操作语言DML(Data Manipulation Language):insert delete update
数据控制语言DCL(Data Control Language):用户管理,权限管理
数据查询语言DQL(Data Query Language):select from where
事务控制语言TCL:
SQL优化方案:
减少数据访问:
返回更少的数据:
减少交互次数:
减少服务器CPU开销:
利用更多资源:
分析SQL语句,是否加载不必要的字段/数据
分析SQL执行计划,思考可能的优化点,索引是否命中等
查看SQL设计的表结构,索引信息
如果SQL很复杂,优化SQL结构
按照可能的优化点执行表结构变化,增加索引,SQl,改写等操作
查看优化后的执行时间和执行计划
如果表数据量太大,考虑分表
利用缓存较少查询次数
语法一:
CASE WHEN field_name >= * THEN 比较结果
WHEN ~
WHEN ~
ELSE ~
END
语法二:
CASE field_name
WHEN 条件判断 THEN 输出结果
WHEN ~
END
SET @name = value;
主键索引:PRIMARY KEY
唯一索引:UNIQUE
普通索引:INDEX
全文索引:FULLTEXT
创建索引:
CREATE index index_name on table_name(field_name)
删除索引:
drop index index_name on table_name
创建索引注意事项:
不适合创建的场景:
索引列包含NULL值
数据量少,修改频率低
列数据经常变化,频繁更新索引
需要计算的字段,索引无效
左侧模糊查询,索引失效,应遵循最右原则
类型为长类型数据字段如:text varchar
创建的场景:
字段的数值有唯一性限制
频繁作为WHERE查询条件的字段
经常group by/order by的条件列
update/dalete条件列
DISTINCT字段
小数据类型字段列
字符创前缀创建索引
区分度高的列适合作为索引
使用频繁的列放在联合索引的左侧
多字段都需创建索引,联合索引优于单值索引
创建视图:
CREATE VIEW view_name AS sql~
创建存储过程:
DELIMITER // *这里的符号自定义 但必须上下一致
CREATE PROCEDURE pro_name(in/out *in输入类型参数 out输出类型参数 name varchar(50) *参数类型)
BEGIN
sql~
sql~
END //
调用存储过程:
CALL pro_name(参数);
查询存储过程:
SHOW PROCEDURE STATUS [LIKE '***']
创建触发器:
CREATE trigger tri_name after/before insert/delete/update on table_name for each row
begin
sql~ where field_name=OLD.field_name;
end
*OLD代表触发的对象数据可以在内部使用OLD代表
原子性:事务中的所有SQL语句是一个整体,不能再分割,要么全部执行成功,要么全部执行失败!
一致性:不管事务最终是失败还是成功,事务前后的业务数据之和是保持一致的。
隔离性:在隔离级别较高的前提下,事务之间是隔离开来的。一个事务看不到另外一个事务正在进行中的操作。要么是看到另外一个事务开始之前的状态,要么看到另外一个事务已经结束后的状态。
持久性:事务成功后,对数据的修改操作将会是永久的
脏读:在一个事务中读取到了另外一个事务没有提交的数据, 就叫做脏读。
不可重复读:在一个事务中,对同一个数据的两次查询结果不一致,是因为中间有人做了修改操作。
幻读:在一个事务中,对同一个数据的两次查询结果不一致,是因为中间有人做了插入或者删除操作.
READ-UNCOMMITTED:读取未提交
set tx_isolation='read-uncommitted';
脏读,幻读,不可重复读
READ-COMMITTED:读取已提交
set tx_isolation='read-committed';
幻读,不可重复读
REPEATABLE-READ(MYSQL默认):可重复读
set tx_isolation='repeatable-read';
幻读(快照读无,当前读有)
SERIALIZABLE:可串行化
set tx_isolation='serializable';