MySQL高级篇详解----01

索引的原理是:索引就是数据结构,给一个字段添加了B+Tree数据结构后,字段就会根据这种数据结构快速的去查到目标数据。
有个问题是: 数据结构是根据数字来排列的,那么像字符类型的字段是怎么根据这种数据结构排列的?
MySQL中存储过程是什么?

MySQL循环批量插入数据01(jdbc原生代码的实现)
MySQL循环批量插入数据02
主键是否自动创建索引?
怎么删除主键索引?
怎么给字符串字段建索引?因为索引是在数字的基础上进行的,字符串中的字母、汉字、特别符号,该怎么转换成数字?是通过UTF-8来计算得出数建的吗?
在hashmap中的key是通过哈希函数运算得出的对应的key。

6.3.1中的数据库读写分离可以使用mycat和AOP实现。那么AOP是具体怎么实现的?
覆盖索引和复合索引的区别:覆盖索引是指select 后的字段是在索引列。复合索引是指索引的一个类型。

一、MySQL的存储引擎

1.1、在MySQL版本5.5之前默认的存储引擎是MYISAM,版本5.5之后默认的存储引擎是InnoDB。

1.1.1、存储引擎InnoDB和MYISAM的区别。
InnoDB支持事务和行锁,外键。MYISAM不支持事务和外键,只支持表锁。
1.1.2、行锁和表锁
当多个线程对同一张表操作时,行锁是允许多个线程同时操作一张表。而表锁,只允许一个线程对一张表进行操作。

二、MySQL的索引

如果发现某一条SQL查询执行慢,应该提前告诉数据库管理员,让创建索引。因为如果数据量大的话,一般创建索引会花费很长的时间。

2.1、MySQL的索引是什么?

2.1.1、MySQL的索引其实是数据结构,具体是采用的数据结构是B+Tree。

为什么没有采用二叉树和红黑树呢?
因为二叉树容易形成歪脖子树,而用红黑树的话,数据量大时,层次结构会比较深。

2.2、MySQL的索引能干什么?

2.2.1、MySQL的索引主要目的是可以提高查询效率

2.3、MySQL的索引分类

2.3.1、单值索引 :即一个索引只包含单个列,一个表可以有多个单列索引
2.3.2、唯一索引 :索引列的值必须唯一,但允许有空值(唯一索引的作用,其实不是提高查询效率,主要是为了防止数据的重复
2.3.3、 复合索引 :即一个索引包含多个列

2.4、存储引擎和索引的区别

每种存储引擎支持的索引类型不同!

2.5、索引设计原则

2.5.1、尽量选择唯一索引
2.5.2、经常在where后面出现的字段

2.6、索引的操作

SHOW INDEX FROM usertest;#展示索引

CREATE INDEX idx_usertest_name ON usertest(NAME);#创建单值索引
CREATE UNIQUE INDEX indexName ON tableName(tableColumns(length)) #创建唯一索引
CREATE INDEX idx_usertest_name_age_address ON usertest(NAME,age,address);#创建复合索引

DROP INDEX idx_usertest_name_age_address ON usertest;#删除索引

2.7、创建前缀索引

创建前缀索引的原因是:该字段的长度比较长。创建前缀索引的值是通过计算最快的查询效率得出(索引的选择性)

三、优化SQL步骤之explain

3.1、查看SQL执行频率

show status like 'Com_______';

在这里插入图片描述

show status like 'Innodb_rows_%';

在这里插入图片描述

3.2、explain 分析执行计划

EXPLAIN SELECT * FROM usertest u , USER ur WHERE u.`age`=ur.`id`;

在这里插入图片描述

字段 含义
id select查询的序列号,是一组数字,表示的是查询中执行select子句或者是操作表的顺序。
select_type 表示 SELECT 的类型,常见的取值有 SIMPLE(简单表,即不使用表连接或者子查询)、PRIMARY(主查询,即外层的查询)、UNION(UNION 中的第二个或者后面的查询语句)、SUBQUERY(子查询中的第一个 SELECT)等
table 输出结果集的表。
type 表示表的连接类型,性能由好到差的连接类型为( system —> const -----> eq_ref ------> ref -------> ref_or_null----> index_merge —> index_subquery -----> range -----> index ------> all )
possible_keys 表示查询时,可能使用的索引
key 表示实际使用的索引
key_len 索引字段的长度
rows 扫描行的数量
extra 执行情况的说明和描述
3.2.1、explain之id,id值表示执行表的顺序
3.2.1.1、当id相同时,执行表的顺序是从上而下。
3.2.1.2、当id不同时,id越高,执行的优先级越高。
3.2.1.3、当id有相同,有不同时,先执行优先级高的。如果相同时,从上而下执行。
3.2.2、explain之select_type
select_type 含义
SIMPLE 简单的select查询,查询中不包含子查询或者UNION
PRIMARY 查询中若包含任何复杂的子查询,最外层查询标记为该标识
SUBQUERY 在SELECT 或 WHERE 列表中包含了子查询
DERIVED 在FROM 列表中包含的子查询,被标记为 DERIVED(衍生) MYSQL会递归执行这些子查询,把结果放在临时表中
UNION 若第二个SELECT出现在UNION之后,则标记为UNION ; 若UNION包含在FROM子句的子查询中,外层SELECT将被标记为 : DERIVED
UNION RESULT 从UNION表获取结果的SELECT
3.2.3、explain之table,关于显示这一行数据的属于哪张表。
3.2.4、explain之type,这是一项重要的指标,一般大于range就可以了。
type 含义
NULL MySQL不访问任何表,索引,直接返回结果
system 表只有一行记录(等于系统表),这是const类型的特例,一般不会出现
const 表示通过索引一次就找到了,const 用于比较primary key 或者 unique 索引。因为只匹配一行数据,所以很快。如将主键置于where列表中,MySQL 就能将该查询转换为一个常量。const于将 “主键” 或 “唯一” 索引的所有部分与常量值进行比较
eq_ref 类似ref,区别在于使用的是唯一索引,使用主键的关联查询,关联查询出的记录只有一条。常见于主键或唯一索引扫描
ref 非唯一性索引扫描,返回匹配某个单独值的所有行。本质上也是一种索引访问,返回所有匹配某个单独值的所有行(多个)
range 只检索给定返回的行,使用一个索引来选择行。 where 之后出现 between &#x
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值