哪些情况需要创建索引
1.住建自动创建索引
2.频繁作为查询的字段要创建索引
3.多表联合查询中,关联字段应该创建索引on两边都要创建索引
4.查询中排序的字段应该创建索引
哪些情况不需要创建索引
1.表记录太少(索引也是需要存储开销)
2.频繁更新的数据(索引需要维护)
3.查询字段使用评率不高
4.在where条件中使用频率不高的字段
为什么使用组合索引
mysql节省mysql索引存储空间调高检索性能,可简历组合索引(能使用组合索引不要使用单列索引)
在一棵索引树上创建索引,有多个字段组成:
优势:效率高、省空间、容易形成覆盖索引
使用:
遵循最左前缀原则
Explain执行计划
MYSQL提供了explain命令,可对select命令进行详细分析,并输出select执行的详细信息,拱开发人员针对优化。
使用explain这个命令来查看sql语句执行计划,有没有使用索引、做全表扫描,分析后可对sql语句做出优化。
参数说明
explain 出来的信息由10列
id、select_type、table、type、possible_keys、key、key_len、ref、rows、extra
select_type
查询类型 主要却别普通查询、联合查询(union、union all)、子查询等复杂查询
type
依次从好到差
system、const、eq_ref、ref、fulltext、ref_or_null、unique_subquery、index_subquery、range、index_merge、index、all
最少要索引使用到range级别。
索引失效
1.全职匹配
2.最佳左前缀法则
3.不在索引上做任何操作(计算、函数、类型转换),会导致索引失效而转向全表扫描
4.存储索引不能使用索引中“范围条件”(> < between)右边的列
5.尽量使用覆盖索引(只范文索引的查询,索引列和查询列一致),减少select *
6.mysql 在使用 !=或 <> 的时候无法使用索引到时全表扫描
7.is null 或 is not null 也无法使用索引
8.like 以通配符开头(like ’%abc‘)也会导致索引失效
9.字符串不加单引号也会导致索引失败
10.少用 or ,也会导致索引失败
MYSQL锁介绍
按照锁的粒度,mysql的锁主要分为3中锁定机制:
全局锁:锁的是整个db。由mysql的sql layer层实现的
表级锁:锁的的是table。由mysql的 sql layer层实现的
行级锁:锁的是某行数据,也可能锁定行之间的间隙。由某些存储引擎实现,比如InnoDB。
按照锁的功能来说分为:共享读锁和排他写锁。
按照锁的实现方式分为:乐观锁、悲观锁
**
表级锁和行级锁的却别:
表级锁:开销下、加锁快;不会出现死锁;锁定粒度大、发生锁冲突的概率最高、并发度最低
行级锁:开销大、加锁慢;会出现死锁;锁定粒度小、发生锁冲突的概率最低、并发度也最高;
MYSQL表级锁
MySQL**的表级锁有两种:
**
一种是表锁<br />一种是元数据锁(meta、data、lock、mdl )
Mysql实现的表级锁定的争用状态变量:
mysql>show status like ‘table%’
-table_locks_immediate :产生表级锁的次数
-table_locks_waited: 出现表级锁争用而发生的等待次数
表锁有两种形式
表共享读锁
表独占写锁
元数据锁介绍
MDL不需要显示使用,在访问一个表的时候会被自动加上。MDL的作用是,保证读写的正确性。你可以想象一下,如果一个查询正在遍历一个表中的数据,二执行期间另一个线程对该表结构做变更,删了一列,那么查询线程拿到的结果跟表结构对不上,肯定是不行的。
乐观锁
版本号、时间戳(程序自己实现),对资源先不锁都可以获取更改,改完了以后才上锁(就是看你的版本号和数据是不是一致的,不一致只能重新获取再更新)
悲观锁
Mysql里面的锁所有的锁都是悲观锁!
死锁:当锁丢失的时候造成死锁!
表级锁
加读锁 read lock(加锁后可以加读锁,不能加写锁,这叫共享读锁)!
加写锁 write lock,加完写锁,不可以加写锁
元数据锁,自动加,当CRUD的时候加读锁。当DDL操作的时候自动加写锁。
MySQL 实现的表级锁定的争用状态变量:
show status like 'table%'
Table_locks_immediate 产生表级锁定的次数。
Table_locks_waited 产生表级锁定争用而发生的次数(数据部位0表示,有表被锁定)。
SELECT * FROM dep;
-- 查看标记锁定争用状态
show status like 'table%';
-- 解表锁
unlock tables;
-- 对表加读锁 加了之后除了加锁的表其他表不可访问。
lock table dep read;
-- 对标加写锁,加了之后除了被加锁的表可访问,其他表不可访问,只有本会话可以修改该表,其他会话不可以修改
lock table dep write;
-- 只有自己这个会话可以对加写锁的表访问
update dep set name ='部门222' where id=2;
行级锁
共享读锁(S)-手动加,select * lock in share mode
排他写锁(X)-自动加(DML insert update delete时自动加),select …. from update