Mysql存储引擎分为两种(InnoDB 跟 MyISAM )
InnoDB 支持事务,MyISAM 不支持事务。
InnoDB 支持外键,而 MyISAM 不支持。
InnoDB 是聚集索引,MyISAM 是非聚集索引。聚簇索引的文件存放在主键索引的叶子节点上,因此 InnoDB 必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而 MyISAM 是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描。而MyISAM 用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;
InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁。一个更新语句会锁住整张表,导致其他查询和更新都会被阻塞,因此并发访问受限。
InnoDB 支持不支持全文索引(可以使用sphinx插件支持全文索引),MyISAM 支持全文索引
Left join 左表所有数据跟右表关联数据(部分笛卡尔积)
right join 右表所有数据跟左表关联数据(部分笛卡尔积)
inner join 左表跟右表都有的数据(部分笛卡尔积)
Join 左表右表所有数据(笛卡尔积)
Group by 分组
having 分组后条件判断
Order by 排序(asc 升序 desc 降序)
Limit 截取数据
执行顺序 from ->on ->Join -> where(由左到右)->group by->having->select->order by->limit
In查询跟exists 区别
In用于条件小于表数据
Exists用于条件大于表数据
二叉树
红黑树 1. 每个节点或者是黑色,或者是红色。 2. 根节点是黑色。 3. 每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
4. 如果一个节点是红色的,则它的子节点必须是黑色的。 5. 从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点
https://www.cs.usfca.edu/~galles/visualization/RedBlack.html
B-Tree
B-Tree是为磁盘等外存储设备设计的一种平衡查找树。因此在讲B-Tree之前先了解下磁盘的相关知识。
系统从磁盘读取数据到内存时是以磁盘块(block)为基本单位的,位于同一个磁盘块中的数据会被一次性读取出来,而不是需要什么取什么。
InnoDB存储引擎中有页(Page)的概念,页是其磁盘管理的最小单位。InnoDB存储引擎中默认每个页的大小为16KB,可通过参数innodb_page_size将页的大小设置为4K、8K、16K,在MySQL中可通过如下命令查看页的大小:
show variables like 'innodb_page_size';
Linux ( getconf PAGESIZE )
B+Tree
Hash
优点: 基于索引列的hash值,以key-value方式存储到hash表中,一般情况下性能比B+Tree高
缺点:
基于hash不能用于大于小于范围查询,不能排序;
联合索引不能遵循最左前缀原则;
大量不同索引的hash值相同时,需要获取实际数据进行比较(数据量大是比B+Tree性能低)
联合索引: 最左前缀原则
索引使用:
id越大,执行顺序越靠前,id相同顺序由上到下
select_type 查询类型
Table 查询表名
Partitions 查询的表分区
Type 常用的类型有: ALL、index、range、 ref、eq_ref、const、system、NULL(从左到右,性能从差到好)
ALL:Full Table Scan, MySQL将遍历全表以找到匹配的行
index: Full Index Scan,index与ALL区别为index类型只遍历索引树
range:只检索给定范围的行,使用一个索引来选择行
ref: 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值
eq_ref: 类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用primary key或者 unique key作为关联条件
const、system: 当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量,system是const类型的特例,当查询的表只有一行的情况下,使用system
NULL: MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成。
推荐优化到ref往上
possible_keys 可能使用到的索引
Key 实际使用的索引
key_len 使用的索引长度
Ref 索引key使用的列或者常量
Rows 过滤出来结果的行数(越少越好)
Filtered 表示返回结果的行数占需读取行数的百分比 Filtered列的值越大越好
Extra 查询用到的信息
索引创建语句:
Alter table usr_user add INDEX idx_account_password
(account
,password
)
数据量大(分区)最好做单表查询(分表,分库)