记录那些坑
本文会持续更新,陆续更新有关mysql技术内幕、实战优化、面试技巧。
前言
重中之重的MySql数据库
mysql数据库不仅在工作中经常使用,面试中也是必问的内容。本文主要内容参考“mysql技术内幕”一书。
提示:以下是本篇文章正文内容,下面案例可供参考
索引
数据库要想查的快,索引得利用好。
数据库要想入的快,索引太多可不好。
mysql中索引类型有:BTree,Full Text,Hash,RTree。
BTree之聚集索引
聚集索引:ID索引
ID索引使用BTree结构,每个表仅且只有一个!!!,(即使没有创建主键,mysql会默认创建一个隐藏列作为ID索引)
BTree高度:
BTree中节点存储键值和地址指针,叶子结点存储键值、指针、数据。
物理上不一定是顺序的,逻辑上是顺序的(通过指针链接)。
BTree之辅助索引
辅助索引就是主键以外的 单个字段的BTree索引类型的了。
辅助索引 叶子结点书签:聚集索引键。
当通过辅助索引来寻找数据时,InnoDB存储引擎会遍历辅助索引并通过叶级别的指针获得指向主键索引的主键,然后再通过主键索引来找到一个完整的行记录。
BTree之联合索引
将多个字段联合一起做索引,索引结构如下:
根据图示需要清楚,键值是个多元组,多元组中是按照字段的顺序进行排列的。所以,在进行查询时,如果没有按照自从向右的字段查询,就会打破联合索引,使之失效!!!
注意:如果创建联合索引(a,b,c);如果查询a和b order by c ,就可以使用到联合索引; 如果查询a 直接order by c,就不会使用到索引,因为(a,c)并没有排序
BTree之覆盖索引
覆盖索引常见的场景为:直接使用索引查询出索引键值、主键的内容,根据索引的字段进行范围或非范围的统计。
判断是否为覆盖索引,使用explain,查看Extra字段,如果为Using index,就表示走了。
案例:(t表,a为主键,c为辅助索引,cd为联合索引,b无索引)
- explain SELECT a from t where c = 1 ; 为覆盖索引
- explain SELECT count(*) from t ; 为覆盖索引
- explain SELECT count(b) from t ; 全表扫描
- explain SELECT count(b) from t where c >10 ; 非覆盖索引,先走c的辅助索引然后走主键索引。
- explain SELECT count(*) from t where d > 0 and d<10 ; 为覆盖索引
使用到的工具
1、py_innodb_page_info工具
首先 git 下载 https://gitee.com/andy_yyf/py_innodb_page_info
clone到合适位置。
本地需要有python2 (一般服务器自带)
执行命令:python py_innodb_page_info.py /{对应的path}/t.ibd -v
2、hexdump工具
在Windows操作系统下,可以选择通过程序UltraEdit打开该二进制文件。在Linux环境下,使用命令hexdump-C-v mytest.ibd>mytest.txt。这里将结果重定向到了文件mytest.txt,打开mytest.txt文件,找到如下内容:xxxx
总结
提示:
本文仅仅简单说明了有关mysql相关内容,如深入理解可读相关层面的书籍。