MySQL 基础学习和实践

目录

 

一、MySQL逻辑框架

二、库表的设计

三、优化的思路:

四、分库分表:


一、MySQL逻辑框架

1、查询缓存:查询缓存的性能,(仅限于5.0.7版本)

2、解析器:词法分析和语法分析;

3、 预处理器:表和列是否存在,字段别名是否有歧义,权限校验等

4、查询优化:

重排关联表顺序;(减少嵌套循环,可通过STRAIGHT JOIN关键字取消重排)

等价变换;(简化表达式,去除冗余判断等)

子查询优化;(子查询需要创建临时表,一般的话会转为表连接)

覆盖索引扫描;(直接访问索引就可以获取到所需要的数据,不需要通过索引取数据行)

提前终止;(已查到满足条件的数据(使用limit)或者检测到where 条件不可能成立时)

5、执行计划:

EXPLAIN:查看SQL执行计划 也是优化查询性能的利器;用法:EXPLAIN + SQL 或 EXPLAIN + SQL/G

【应用截图】

SHOW WARNINGS : 显示最后一个执行的语句所产生的错误,警告和提示等信息 ; 在EXPLAIN 之后,执行该语句可以看到重建后的查询语句

【应用截图】

6、执行查询:

MySQL对任何关联都执行嵌套循环关联查询:无论是关联几张表的查询,都是用的for循环嵌套查询的!!!

存储引擎是负责查数据的,他要将所有数据都查出来 丢给执行引擎,再去执行where条件;也就是说存储引擎做的事情就是保证数据的检索和传输,执行引擎做数据的过滤!

(那么对于查很大的数据表的话最好改成内关联,先把有用的数据取出来)

(工程中子查询的话,是需要建立临时表的,消耗IO 最好把子查询改为join)

7、存储引擎:

 

InnoDB

MyISAM

存储限制

64TB

256TB

事务

支持

不支持

锁粒度

行级锁

表级锁

外键

支持

不支持

支持的索引

B-Tree全文索引

哈希索引

B-Tree全文索引

表格行数

通过全表扫描,动态统计

已存储表行数

 

二、库表的设计

1、什么是索引?

索引是存储引擎用于快速找到记录的一种数据结构(常见的类型是:B+Tree Hash)

举个例子:查找productId <= 52595的信息

首先查找出productID 为 52595的节点,(如果没有没关系,找到第一个小于52595的之后就开始遍历,遍历的过程中就把数出来)

B+Tree : 双向链表串起来的;列越少表示树的高度越低,每遍历一层树结构会读一次IO;所以尽量减少列的空间(能用int 不要用bigint)

Hash:冲突一般是用链表串起来的,等值查询的话较高效,注意哈希键值的选取!

特性

B+Tree

Hash索引

等值查询

支持

支持

范围查询

支持

不支持

使用部分索引键查询

支持

不支持

结果排序

支持

不支持

查询平均时间复杂度

O(log mn)

查询性能比较稳定,m为单节点关键字个数,n为总关键字的个数。

理论上,n一定,m越大,输的高度越低,查询复杂度越低。

O(1)

等值查询高效,键重复率高时性能退化。

2、数据组织方式?

聚簇索引:表记录的物理存储顺序与索引顺序一致,且索引的叶子节点就是数据节点

非聚簇索引:表记录的物理存储顺序和索引顺序无关,叶节点包含索引键值(只存指针)以及指向对应数

2.1 主键索引&二级索引 :

  • 主索引是表的主键,二级索引可以根据你自己需要用到表的任何字段的组合来创建。

一般我们会键一个自增的主键来保证后面能够取出所有主键;就如果我们自己不建的话innodb也会帮我们建一个;因为他要保证这个聚簇索引的存在

因为,如果主键值随机在插入记录或更新主键时,可能造成记录移动或页分裂,影响性能。

select * 可能会导致两次查询很影响效率!!!注意一定不要select *

2.2如何设计索引

  • 建议:where ; join ; group by ; order by(排序用的) 等语句使用的列 一定要设为索引!!!

  • 利用最左前缀(A,B,C): A, AB, AC, ABC, B, C, BC (一定是A列先键这样才能路由过来,顺序无所谓,但是一定要有!!!)

  • 经常被使用到的列优先键索引(poiId productId): 尽量复用已有索引

  • 区分度大的列优先(也就是不重复的值!这样的话能够快一点)

  • 宽度小的优先

2.3如何优化索引(按性能由好到差排)

  • const , system:最多一个匹配行,使用主键或者unique索引

  • eq_ref:返回一行数据,通常在链接是出现,使用之间或者unique索引

  • ref:使用key的最左前缀,且key不是主键或unique键

  • range:索引范围扫描,对索引的扫面开始于某一点,返会匹配的行

  • index:以索引的顺序全表扫描,(优点:不用排序;缺点:还是需要全表扫描)

  • all:全表扫描,这个是需要避免的

 

三、优化的思路:

四、分库分表:

1.什么是分库分表

  • 把原本存储在一个库里的数据分块存在多个库里

  • 把原本存储在一个表里的数据分块存储到多个表里

     

2.怎么做

  • 垂直拆分:将表按照功能模块,关系密切程度进行划分,部署到不同的库上

  • 水平拆分:当一个表中的数据量过大事,将该表的数据按照某种规则分散到多张表上,并分散在多个库里

 

3.水平拆分核心点

  • 分表策略:

    哈希:取模路由 ;

    range:根据业务查询主体标识的值进行划分

  • 分表数:遵循部门规则

  • 全局主键生成策略:UUID ; 数据库自增ID ; Snowflake ; Leaf

你可能感兴趣的:(Java,美团点评)