标签:loop index 关联 设置 丢失 upd art 校验 creat
2.5叉B树:key的数量[ceil(m/2)-1]<=n<=m-1,n>4时,中间节点向上分裂,两边节点分裂。
3.m叉BTree: 1.树中每个节点最多有m个孩子
2.除了根节点与叶子节点,每个节点至少有[ceil(m/2)]个节点
3.若根节点不是叶子节点,则至少有两个孩子
4.所有的叶子节点都在同一层
5.每个非叶子节点有n个key与n+1个指针组成,其中[ceil(m/2)-1]<=n<=m-1
4.叉B+Tree:1.最多有n个key,BTree最多有n-1个 key
2.B+Tree的叶子节点保存所有的key,依key的大小顺序排列
3.所有的非叶子节点都可以看做key的索引部分,所有的数据页保存在叶子节点,
4.叶子节点之间有指针,便于范围查询
5.create index idx_city_name on city (city_name); 创建索引
6.show index from city \G查看索引 create view view_city as select语句 创建视图 一张虚拟的表 简单 安全 数据独立
7.drop index idx_city_name on city 删除索引
8.alter table city add unique/primary idx_city_name(city_name); 创建唯一/主键索引
9.查询频度高,在where条件后选取最常用,过滤效果好的列,使用唯一索引,短索引,提升I/O效率,复合索引用最左前缀原则
10.存储过程和函数是事先经过编译并存储在数据库中的一段SQL语句的集合。简化开发人员的工作,减少数据在数据库与服务器之间的传输。函数有返回值,过程没有 delimiter 声明SQL语句分隔符
11.create proceduce proceduce_name(in/out/inout 传入/输出/ num int,@decription/@@decription用户/系统会话变量)参数传递
`begin
//declare num int default 10;
声明变量
set num=num+10;
给变量赋值
select语句
end;创建存储过程
call proceduce_name()调用存储过程
12. show/drop procudure status \G查看/删除存储过程 b
13.repeat 语句 util 满足条件 退出循环 end repeat;
c:loop
set n=n-1;
if n<=0 then loop循环。leave 退出
leave c;
end if;
end loop c;
14 .游标是用来存储查询结果集的数据类型
create procedure pro_test11()
begin
declare e_id int(10);
declare emp_result cursor for select查询语句 //声明游标
open emp_result; //打开游标
fetch emp_result into e_id;//fetch只能一行一行获取 用循环获取
select concat(‘id=‘,e_id);
close emp_result; //关闭
end;
15. 触发器是与表有关的数据库对象,在增删改之前或之后,触发并执行触发器中定义的SQL集合
create trigger emp_insert_trigger
after insert
on emp
for each row
begin
insert into emp_logs(id,....) values(new.id) 修改前old 修改后 new
end;
16.存储引擎是存储数据,建立索引,更新查询数据等技术的实现方式。
Innodb 支持事务,外键,表锁,行锁(默认,适合高并发) MyISAM不支持事务,外键,表锁 访问速度高
开启事务 增加数据 不提交 查询不到 on delete restrict/on update cascade
MyISAM .frm存储表结构 .MYD存储数据 .MYI存储索引
Innodb frm存储表结构 .ibd存储数据索引
MEMORY .frm存储表结构 数据存储在内存 效率高
MERGE 是一组MyISAM表的组合
17 . 查看SQL 执行效率 show (global)status like ‘Com_____‘/InnOdb_rows_%;查看增删改查的次数
18 . 定位低效率执行SQL
1.慢查询日志 2.show processlist time(时间) state(状态) info(语句)
19. explain 分析执行计划
id: 相同是加载顺序从上往下 不同 值越大 优先级越高 越先被执行
select_type: simple 简单查询 不包含子查询 union
primary 包含子查询 最外层位次标志
subquery 在select where中包含 子查询
derived 在from中包含子查询 递归执行 把结果放在临时表中
union 在第二个select 出现union
union result 从union 表获取结果 从上往下 ,效率越低
table: 数据来源于哪张表
type: null 不查询任何表 select now();
SYSTEM 表中只有一条数据
const 通过一次索引就找到,只返回一条数据
eq_ref 多表关联查询 主键 唯一索引返回一条记录
ref 非唯一索引 返回多条数据
range 范围查询 between > < in
index 遍历索引树
ALL 遍历数据文件 从上往下 ,效率越低
possible_key: 可能用到的索引
key: 实际用到的索引
key_len: 索引长度 越短越好
ref:
rows: 扫描的行
Extra: using filesort/temporary/index
20. show profile分析SQL
select @@having_profiling YES 支持
select @@prifiling 0未开启
show profiles query_ID Duration(消耗时间) query(语句)
SHOW profile for query query_ID 具体
21. trace分析优化器执行计划 MYSQL5.6以后
set optimizer_trace="enable=on" end_markers_in_json=on;
set optimizer_trace_max_mem_size=100000
select *from information_achema.optimizer_trace\G;
22. (1) 复合索引的最左前缀原则是不跳过索引列,跟先后顺序无关 。
(2)范围查询后面的,索引会失效。
(3)在索引列上计算,索引会失效。
(4)varchar类型的要加单引号,否则索引失效。
(5)尽量用覆盖索引,不要select * using index condition 会回表查询整行数据。
(6)用or分割开的条件,or前用到索引,or后没用到,整体都不会用索引。
(7)like模糊查询 避免‘%xsacs‘ 索引会失效,优化 select 索引列 from emp like ‘%xsacs‘会走索引。
(8)全表扫描比索引快,则全表扫描,不走索引。例如address 是索引列,但99%是北京,1%是西安。
(9)is NULL 和is not NULL都不定会走索引,is NULL大部分是空会走全表扫描,is not NULL也一样。
(10)in 走索引(主键索引),not in 不走索引。
(11)尽量使用复合索引(创建一个复合索引相当于创建多个单列索引),少使用单列索引(会选择最优的一个索引)。
23. 导入大批量数据时:主键有序的快,关闭唯一性校验。set unique_check=0;手动提交事务。
24. insert 优化 insert into tb_test values (1,‘Tom‘),(2,‘Jerry‘),(3,‘Cat‘);
手动提交事务.
25. order by 优化 (覆盖索引)using index比filesort效率高。多个字段时,字段顺序要与索引顺序一样;要 么全升序,要么全降序。filesort max_length_for_sort_data>Query语句取出的大小(sort_buffer_size) 使用一次性扫描算法,反之有二次扫描。
26. group by 优化 排序后进行分组 不进行排序 order by null; 创建索引。
27. 子查询优化 用多表联合查询代替子查询。
28. or 优化 or前后都用索引。or 不会使用复合索引, 用union 代替or.
system>const>eq_ref>ref>fulltext>ref_or_null>index_merge>unique_subquery>index_subquery>range>index>ALL
29. 分页查询优化 1.在索引列上完成排序分页 2.主键自增 select * from tb_item where id>20000 limit 10;主键被删除会出现断层。
30. 使用SQL提示
use/ignore index(index_seller_name)
force index(index_seller_name)强制使用该索引
`
31. 应用层面的优化
1.使用数据库连接池
2.减少对MYSQL的访问(避免对数据的重复访问)
3.增加cache层 (使用mybatis/Hibernate的一二级缓存,以及使用redis)
4.MYSQL集群 读(从节点)写(主节点)分离
32. *Mysql 中查询缓存优化*
当执行相同的SQL语句时,服务器会从缓存中读取结果,当数据被修改时,之前的缓存会失效,修改频繁的表不是做查询缓存.
show variables like ‘have_query_cache‘; //是否支持查询缓存 ON /OFF
show variables like ‘query_cache_type‘; //是否开启 0/1 DEMAND(select SQL_(NO)_CACHE title fom emp where id=1;)
show variables like ‘query_cache_size‘; //查看缓存大小 size/1024/1024
show variables like ‘Qcache%‘; //查看查询缓存的状态信息(命中/增加次数,走与未走缓存数量)
33. *查询缓存失效的情况*
s/Select * from EMP; //查询数据不一致
select now(); //查询语句中有一些时不确定的
select ‘A‘; //不使用任何表查询
select * from mysql/infomation_schame ; //查询系统数据库时
5.在存储函数,触发器的主体内查询
6.当表更改时,使用该表的所有高速查询缓存都将变为无效并被删除 insert/update/delete/drop
34. Mysql内存管理及优化
34.1 MyISAM 存储引擎使用 key_buffer缓存索引块,加速myisam索引的读写速度
key_buffer_size=512M //在/usr/my.cnf配置
read_buffer_size //每个session独占 ,不能太大
read_rnd_buffer_size //用于做排序的MYISAM表,如 order by 每个session独占 ,不能太大
34.2 InnoDB 用一块内存块做IO缓存池,会缓存数据块 ,索引块
innodb_buffer_pool_size=512M //在操作系统,内存足够可用的时候,设置的值越大,缓存命中越高,访问Innodn表需要的磁盘IO越少,性能越高
innodb_log_buffer_size=10M //增加值的大小,避免Innodb在提交事务时不必要扽日志写入磁盘操作
35. Mysql并发参数调整
max_connections //允许连接到mysql的最大连接数 默认值时151 linux平台支持500-1000不是难事
back_log //请求数量大于max_connections,其余请求将被存在对栈中 50+(max_connections/5)
table_open_cache //用来控制所有sql语句执行线程可打开表缓存的数量
thread_cache_size //控制mysql缓存客户服务线程的数量
innodb_lock_wait_timeout //用来设置Innodb事务等待行锁的时间,默认值是50ms
36. 表级锁 :偏向MyISAM,开销小,加锁快,不会出现死锁,锁粒度大,发生所冲突的概率最高,并发度低;写优先
读锁(共享锁): lock table EMP read; //同一客户端加锁后,只有释放才查询其他表
(读锁只阻塞其他线程的写操作,不会阻塞读操作)
写锁(排它锁): lock table EMP write; //(写锁会阻塞其他线程的写操作,读操作)
show open tables; in use列 查看被锁定的表
show status like ‘Table_lock%‘; table_locks_waited 越高,锁争抢越严重
行级锁 :偏向Innodb,开销大,加锁慢,会出现死锁,锁粒度小,发生所冲突的概率低,并发度高;
索引失效,行锁会升级成表锁
间隙锁 ID自增出现断层 insert/update/delete时会加排他锁,对断层加间隙锁, 断层是添加不进来的
读锁(共享锁): select * from EMP where ...lock in share mode
?
写锁(排它锁): select * from EMP where ...for update insert/update/delete会自动加写锁
37. 并发事务处理带来的问题
1. 丢失更新: 当多个事务选择同一行,最初的事务修改的值,会被后面的事务修改的值覆盖.
脏读:一个事务对数据访问并修改但未提交,另一个事务访问数据并使用. 3. 不可重复读: 一个事务在读取某些数据的某个时间,再次读取以前的数据,发现和以前读取的不一样(修改)
幻读:一个事务按照相同的查询的条件重新读以前查询过的数据,发现其他事务插入了满足条件的新数据(插入)
38. 事务隔离级别
事务隔离级别越高,性能越低
隔离级别 | 丢失更新 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|---|
Read uncommited | 能解决 | 不能解决 | 不能解决 | 不能解决 |
Read commited | 能解决 | 能解决 | 不能解决 | 不能解决 |
Repeatable read (默认) | 能解决 | 能解决 | 能解决 | 不能解决 |
Serializable | 能解决 | 能解决 | 能解决 | 能解决 |
39. SQL执行顺序 FROM > ON > JOIN > WHERE > GROUP BY > HAVING > SELECT >ORDER BY > LIMIT
SELELCT * FROM EMP WHERE NAME REGRXP ‘^s‘ / ‘S$‘ / [unc]
正则表达式的使用
40. *Mysql 常用工具*
mysql -u / -p / -h (主机)/ -p(端口) demo_03 -e ‘select * from EMp; -e 执行语句
mysqladmin -uroot -proot create/drop ‘demo01‘ version ;创建/删除数据库 查看版本
mysqlbinlog -vv mysqlbin.000001 查看二进制日志文件
mysqldump -uroot -proot demo_03 tb_book > tb_book.sql 备份数据到tb_book.sql
mysqldump -uroot -proot demo_03 ----add -drop-table > tb_book.sql
mysqldump -uroot -proot -T /tep demo_03 tb_book 在tem目录下生成.sql .txt 文件分别生成表结构和数据
mysqlimport -uroot -proot demo_03 /tem/tb_book.txt 导入txt文本数据
resource /root/t‘b_book.sql 导入sql文件
mysqlshow -uroot -proot demo_03 tb_book --count(表的统计)/-i(表的详细状态信息)
41. Mysql日志
show variables like ‘log_error%‘; 错误日志 默认开启 查看日志地址
?
log_bin=mysqlbin 在/usr/my.cnf 二进制日志 记录DDL DML(增删改无查询) 用于mysql复制生成
mysqlbin.000001以及mysqlbin.index
binlog_format=STATEMENT/ROW/MIXED 记录语句/变更信息/
?
Reset Master 删除并重新记录日志
purge master logs to ‘mysqlbin.00006‘ 删除mysqlbin.00006编号之前的日志
purge master logs before ‘yyyy-mm-dd hh24:mi:ss‘ 删除在这时间之前的日志
--expire_logs_days=# 设置日志过期天气
?
general_log =1 查询日志 记录所有的 查询 语句
general_log_file=query_log.log
?
slow_query_log = 1 慢查询日志 记录了所有执行时间超过参数long_query_time并且记录数不小于min_examined_row_limit的SQL语句的日志 效率低的语句
slow_query_log_file=slow_query.log
long_query_time=10 默认10秒 mysqldumpslow slow_query.log 查看日志
42. Mysql主从复制原理
Mater主库在事务提交时,会把数据变更作为时间jiluEvent记录在二进制Binlog中
主库推送二进制日志文件Binlog中的日志事件到从库的中继日志Relay Log
slave重做中继日志中的事件,将改变反应它自己的数据
标签:loop index 关联 设置 丢失 upd art 校验 creat
原文地址:https://www.cnblogs.com/luyuefei/p/12736970.html