
了解底层架构是什么样子的:
select name from user where id=1;
- sql接口:sql的入口 当前线程监听到sql发过来之后 mysql其实根本不知道这个是啥子意思 他会把sql交给sql的入口sql接口
- sql解析器:相当于知道这个sql到底想干啥子 这条sql想从user表中去拿name这个字段但是这个问题在于怎么去做?
sql优化器选择一个最优解:
两种做法:
- 先提取出来所有user表的数据 然后再去过滤掉id等于一这个记录然再去拿name这个字段的值
- 先提取出来所有user表的数据去拿那么所有字段的值,然后再去找这么多字段里面id=1这个字段
- 通过这个sql优化器就选取一个最优的获取的数据方式去拿到这个数据
你要知道这个数据库其实就是去操作磁盘中的数据,或者内存数据那么现在就有问题,你已经知道做什么事情,怎么做这个事情但是呢你现在的角度是sql角度想问题,比如说这个数据到底在哪儿那么就可以使用存储引擎
mysql插拔式的编程技术
sql解析器只是知道做啥子但是到底怎么做就得要交给sql优化器
sql执行器就会拿着前两个兄弟的分析结果就去执行
sql执行器最终都会把数据直接注入到磁盘或者内存里面去
他只是执行但是它不知道当前这个数据所在磁盘或者内存里面
那么这些问题都会去交个主键(存储引擎):知道这个数据在哪里
最常用的是Inodb帮助执行器更好的执行sql(11种多的存储引擎)
为什么会有这么多存储引擎是因为客户的需求不一样
比如说你现在要进行事务操作,那么你就需要一个事务引擎
总体来说插拔式就对引擎进行插拔

图片上的sql语句就进行了一个回表操作为什么这样说呢,分析它辅助列索引和主键索引是一个树结构吗,那么
它根据这个sql语句去找到了xc但是这里里面没有age这个字段那么它就又要回表去到主键列索引(回表查询会降低性能)
回表查询是mysql优化手段之一所以我们要尽量的去避免回表
主键列查询效率快,性能最高
综上所诉:
mysql的底层innodb引擎,我们的索引是B+TREE
然后B+TREE索引 同时你站在存储的角度上来看
它又聚餐索引
每张表里面都默认有一个主键
如果你指定主键,他会以表中第一个非空字段设置主键
msyql会给你生成隐藏主键性能一定是最高的无论什么情况
