索引(Index)是帮助mysql高效获取数据的数据结构
数据本身之外,数据库还维护这一个满足特定查找算法的数据结构,这些数据结构指向了数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
使用B数作为索引结构,如果删除数据 树的结构改变会造成索引失效,所以一般 service层删除数据底层其实是updata操作,把这个数据改成为激活状态 一般不删除数据。
一般来说 索引本身很大,不可能全部存在内存中 ,因此索引旺旺以索引文件的形式存在磁盘上
优势:提高数据检索效率,降低IO成本 降低数据排序成本 降低CPU消耗
劣势:索引也是一张表,存储了主键和索引字段,并指向实体记录,所以索引也占空间,虽然索引提高了查找效率,但是降低了更新表的速度,如插入,更新,删除操作,因为更新表时,MySQL不仅保存数据,还保存索引文件每次更新了索引列的字段,
单值索引:一个索引只包含单个列,一个表可以有多个单列索引
唯一索引:索引列的值必须唯一,但允许有null
复合索引:一个索引包含多个列
基本语法:
创建: create index 索引名 on 表名(字段名。。。)
alter 表名 add index 索引名 on (字段名)
删除:drop index 索引名 on 表名
查看:show index from 表名
BTree索引:
Hash索引:
full-text索引:
R-Tree索引:
主键自动建立唯一索引
频繁作为查找条件的字段应该创建索引
外检建立索引
频繁更新的字段不适合创建索引
where条件用不到的字段不创建索引
排序字段通过索引会大大提高效率
统计或分组字段建索引
表记录太少不要建索引
经常增删改的表不要键索引
某一列有太多重复的内容不要键索引
是什么?
简称 执行计划
使用explain关键字可以模拟优化器执行SDQl查询语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈
怎么玩?
explain+sql语句
就会显示这么一个表头
id相同,执行顺序由上至下
id不同,值越大 执行越优先
id有相同也有不同值:有限制性值大的 值相同的由上到下执行
simple 简单的查询,查询不包含子查询或union
primary 查询中包含任何复杂的子查询,最外层查询标记为primary
subquery 子查询被标记
derived 在from列表中包含的子查询被标记
union 如果第二个select出现在union之后 则被标记
union result 从union表获取结果的select被标记
这个字段分八种类型
从好到坏依次是:system》const》eq_ref》ref》range》index》all
十分重要的额外信息
建表
虽然我们建立了索引解决了全表扫描 但是没有解决 using filesort 因为范围字段键索引会失效
解决:不给comments键索引 给其他俩个建立索引
建表
给连接字段建索引
左连接 索引建立在右边 右连接索引键在左边
为后面的俩个表的连接字段建索引
注意 连接的时候 一定是小结果集驱动大结果集
有一张表 三个字段 name age dev 我们都建立索引
分别执行三条sql语句的效果
如果 不用条件没有name或没有age 会造成索引失效
上面索引失效是因为违背了最佳左前缀法则
最佳左前缀法则:如果索引了多个列,查询从索引的最左列开始并且不跳过索引中的任何列,(说白了就是 某个索引没用 该索引后面的索引全部失效)
查询的时候索引列上做了计算 该索引列会失效
查询条件某个索引字段是范围查询,后面的索引全部失效
少用select * 尽量使用select 建过索引的列
使用不等于就相当于使用了大于号小于号 后面的索引会失效
is null 和 is not null 索引会失效
%加在左边会索引失效 转而全表扫描 尽量写到右边’ ‘张%’’ 在业务中就得加到左边怎么避免索引失效
使用覆盖索引 可以避免加了%的索引失效 where中可以有主键也没事 但要是出现非主键也不是索引列的就会失效
varchar类型字段 不写单引号查询是重罪 直接索引失效
因为它违背了索引字段不能操作原则 不写单引号会数据类型转换操作
带头大哥不能死 中间兄弟不能断 索引列上不计算 like百分加右边 范围之后全失效 字符串里有引号
1、索引顺序为 1 2 3 4 搜索的时候 4 3 2 1 索引会失效么?不会 因为底层有排序 不论你的搜索顺序如何 都会按照建立索引的顺序排序 排序之后按照 索引失效的是个情况 判断具体用到了几个索引
2、
3order by 索引 不会自动排序 顺序不对会出现文件排序
4当索引出现在条件中 并且出现在order by 顺序就无所谓了 都对
5group by 后的索引顺序不对 会出现临时表和文件排序
order by 索引列 会不会产生 filesort 如何避免?
不用 *
查询字段和排序字段相同
慢查询日志
开启慢查询日志
开启之后只针对当前数据库生效 重启mysql后失效
日志分析一般使用mysql自带的命令 不会人工区查看日志
使用myisam引擎创建一个student表和teacher表 使用该引擎无论上读锁还是写锁都是表级锁
myisam根据查询还是更新操作自动上读写锁
手动增加锁 lock table student read,teacher write
show open tables;查看哪些库的那些表被上了锁
unlock tables 释放全部表的锁
操作:
前提:session1 给student表上读锁 lock table student read
1:session1可以读student
2:session1更新student表 报错
3:session1读取其他表报错 因为没释放锁
4:session2 可以读student
5:session2更新student表 被阻塞知道session1释放锁
操作 :session1给student表上写锁 lock table studnet write
1:session1可以读studnet表
2:session1可以更改studnet表
3:session1读其他表报错 因为没释放锁
4 session2 读studnet表被阻塞 知道session1释放锁
开销大,加锁慢,会出现死锁,锁粒度最小,发生锁冲突概率最低,并发度最高
使用innodb引擎建表 student 字段有 name age 并且为 name 和 age建立索引 并关闭 事务自动提交 set autocommit =0
操作行的时候会自动加行锁
varchar类型 不写单引号查询 直接回升级为表锁
当我们使用范围条件搜索数据的时候 ,innodb会给范围内的所有行加锁,当满足范围但又不存在的数据就是间隙,innoDB也会对这个间隙加锁,这个就是间隙锁
危害:这些不存在的键值会被无辜的锁定,而造成在锁定的时候无法插入这条记录(阻塞),会对性能造成危害
begin:
select * from 表名 where id =1 for update ; 为id=1的这行上锁 之后再各种操作 其他会话操作会被阻塞
各种操作
commit;
slave会从master读取binlog文件进行数据同步
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xxDwyElF-1590486046875)(C:\Users\李嘉伟\AppData\Roaming\Typora\typora-user-images\image-20200526170452420.png)]
每个slave只有一个master
每个slave只能有唯一一个服务器ID
每个master可以有多个slave
mysql版本一致
主从都配置在mysqld节点下,都是小写
修改my.cnf配置文件
主机
1 配置id
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sPk3NvF9-1590486046876)(C:\Users\李嘉伟\AppData\Roaming\Typora\typora-user-images\image-20200526171031322.png)]
2开启二进制日志
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F456hbHY-1590486046877)(C:\Users\李嘉伟\AppData\Roaming\Typora\typora-user-images\image-20200526171127608.png)]
从机
在mysqld下
server-id=2
最后
主机从机关闭防火墙
主机在命令行开启授权
设置从机的ip地址 和从机可以以什么身份什么密码访问主机
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rPGtidPa-1590486046879)(C:\Users\李嘉伟\AppData\Roaming\Typora\typora-user-images\image-20200526172058848.png)]
主机查询master状态
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-22SCHPkO-1590486046879)(C:\Users\李嘉伟\AppData\Roaming\Typora\typora-user-images\image-20200526172250194.png)]
从那个文件 哪一行开始赋值 赋值哪些库 不复制哪些库
从机命令行
设置主机ip地址 以什么身份 什么密码访问主机 赋值主机的什么库从哪一行开始赋值
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HyNJ17fr-1590486046880)(C:\Users\李嘉伟\AppData\Roaming\Typora\typora-user-images\image-20200526172618822.png)]
最后 执行 start slave
查看是否成功
出现yes 代表成功
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oS15ChlR-1590486046880)(C:\Users\李嘉伟\AppData\Roaming\Typora\typora-user-images\image-20200526172838953.png)]
stop slave 停止主从复制