三.MYSQL索引,引擎和事务

32 阅读6分钟

三、索引****

索引:

类似于书中目录,帮助可以快速查找想要找的内容

1)索引根据算法来分****

b树 ,b+树,B*树    r树  hash索引 全文索引 GIS索引

查找数据:二分法 B树

再表中分出存储页,每个存储页是16K,将数据安装树形结构开始存储

将数据按照大小排列存储再叶子节点上

2)按照索引功能****

辅助索引:先创建一个普通索引,然后数据表按照索引将数据排序,当查找数据的时候根据B树找到存储页中我们要找字段的信息位置,根据叶子节点数据信息位置去表中调取数据

聚集索引:聚集创建根据是主键索引或者唯一性索引创建,基于主键索引和唯一性索引的特点,表再创建存储数据的时候就开始按照主键索引或唯一性索引开始排序,所以聚集性索引直接将表作为了叶子节点,当查找数据的时候根据b树算法直接找到叶子节点就可以查找出要找的数据。

B树算法的特点,树高越高查找效率越低,所以树高尽量控制再三到四层即可。

影响树高的因素:

1、数据量的大小,解决方法是,细化业务实行分库分表

2、字段长度,解决方法采用的是前缀型索引

3、数据类型:char 还有一种字符类型叫varchar

主键索引的特点:不能为空,不能重复,全表唯一

唯一性索引的特点:可以为空,不能重复,全表唯一

3)创建索引****

查询表的索引的语句:desc 表;或者show index from benet;

普通索引:create index idx_bname on bumen(bname);

alter table bumen add index idx(bid);

创建主键:alter table bumen add primary key(bid);

创建唯一性索引 alter table bumen add unique index idx_bname(bname);

创建前缀索引 :alter table benet add index idname(name(3));  (前缀型索引的字段类型不能是int,)

创建联合索引:alter table benet add index idx_na_ag(name,age);

删除索引:drop index idx_bname on bumen;

alter table bumen drop index idx;

删除主键:alter table benet drop primary key;

alter table benet change id id int(2);

图片2.png

图片1.png

这种语句ddl语句,是更改表结构,执行这语句会锁库缩表,所以要再业务低峰期执行

mysqlslap --defaults-file=/etc/my.cnf \

--concurrency=100 --iterations=1 --create-schema='yun1' \

--query="select * from t100w where k2='MN89'" engine=innodb \

--number-of-queries=2000 -uroot -p123123 -verbose

查看MySQL并发

mysql -uroot -p123123 -e "show processlist" |wc -l

添加索引之后 alter table t100w add index idx_k2(k2);

时间会少很多

 

执行计划是查看sql语句再sql层预执行时选择哪个语句

查看执行计划:explain select * from bumen;   或者是desc select * from bumen;

常见的type类型:ALL、index、range、ref、eq_ref、const(system) null  (越往右的效率越高)

desc select name from benet where name='y';

图片3.png

全文搜索的时候只有主键索引和唯一性索引走的索引,普通索引走的是全文搜索。

如果想要走rang格式搜索要加比较的定义的范围

当采用in或者all语句的时候效率是没用比较运算符高的,为了提高执行效率可以采用union all的方式,多写几个语句

A join B A是驱动表,B是子表,A经常走的是全文搜索,所以通常习惯将数据量小的做成驱动表,用子表的主键索引和唯一键索引作为连接两个表的字段效率更高

辅助索引不支持模糊查询和取反

创建表的给表指定好字符类型字符类性是utf8mb4,utf8默认字符长度是3,utf8mb4默认长度是4

char   key_len 键长g4 允许为空 是键长4+1

varchar      键长4+2     允许为空是键长4+3

extra  useing sortfile  说明排序不符和逻辑,语句不是最优

 

4) 创建索引的原则依据****

1、表的主键、外键必须有索引
2、数量超过 300 行的表应该有索引
3、经常与其他表进行连接的表,在连接字段上应该建立索引
4、唯一性太差的字段不适合建立索引,最好使用唯一值多的列,建立联合索引,唯一性越好的,越要排前。
5、更新太频繁的字段不适合创建索引
6、经常出现在 where 字句中的字段,特别是大表的字段,应该建立索引,是否建索引要看调用的频率。
7、索引应该建在选择性高的字段上
8、索引应该建立在小字段上,对于大的文本字段甚至超长字段,不要建立索引。
9、索引不是越多越好,不常用的索引要清理。

四、引擎和事务****

1)引擎****

引擎为表的存储提供基础,提高表的读写效率,日志,备份,恢复等

常见的存储引擎是两种一种是innodb,myisam.

现在也出现第三方的存储引擎:sockdb,tokudb

myisam是5.5版本之前的默认引擎 5.5之后的默认引擎是innodb

 

innodb的特点: myisam的特点:

1、支持事务 1、不支持事务

2、写入数据的innodb是行级锁表 2、写入数据的时候表级锁表

3、读写阻塞但是对索引阻塞 3、读写阻塞

4、可以缓存索引也可以缓存数据 4、只能缓存索引名称

5、对硬件要求高 5、对硬件要求低

查看数据库支持的引擎类型:show engines;

存储引擎既可以整体设置,也可以对某个表单独指定(创建的时候指定)

查看某个表的的存储引擎类型show create table bumen;

更改表的存储引擎的语句:alter table bumen engine=myisam;这条语句可以整理碎片

最好的整理磁盘碎片的方式是。把表导出来,再导进去。

2)事务****

事务的特点

原子性:事务是独立,完整的,不可以拆分,少了任何一个环节都不能完成事务。

一致性:必须各个业务对应关系同增同减保持数据总量的一致性。

隔离性:每个事务之间都是独立的,互不干扰。。

持久性:事务一旦产生了变化,是长期存在的,不会改变。

 

事务从begin开始,回滚:rollback commit结束

查询事务状态:select @@autocommit;

设置事务临时局部生效:set autocommit=1;

设置事务全局生效:set global autocommit=1;

要永久生效,需要修改配置文件再my.cnf的[mysqld]模块下增加autocommit=1

 

ddl   alter

dcl   grant set

dml  insert update delete

dql   select