sql语句优化
1.mysql 执行流程
客户端:
发送连接请求,然后发送增删改查sql语句进行执行
服务端:
1.连接层:提供和客户端连接的服务,在tcp协议下,
提供多线程并发的技术,让多个用户登录到mysql中.
show processlist; 查看所有登录到mysql的用户进程
2.服务器:
提供了各种接口(增删改查..)分析器组件会解析用户的sql语句
如果发现sql语句执行效率较低,会提交给优化器组件进行优化,然后在执行
(查询缓存:把上次搜过的数据,或者提前存储的数据直接返回,效率加快)
(优化器:mysql query optimizer )
3.存储引擎:
存储或者提取数据
innodb : 支持事务处理,支持行锁,支持高并发
myisam : 支持表锁,不支持高并发
4.日志文件
产生binlog日志 (二进制文件)
2. sql 卡顿原因
硬盘读写数据,io延迟高,sql语句性能低,导致sql执行的时间漫长
表中的数据没有任何索引,并且数据量较大,也会造成sql语句查询速度慢
3. 索引
索引(index)概念:
是一个树状的数据结构,即(B树结构,分支节点>2)
相当于字典的目录,功效是加快查询速度
常用树:B树(banlance-tree),二叉树,红黑树,hash树
树节点概念:
根节点(最顶级节点)
分支节点(父节点,子节点)
叶子节点(最后一层存储数据的节点)
树的高度(树的层级,理想情况下三级,任何数据最多需要3次查到,支持百万级别的数据查询,追求树的矮胖结构.)
4. innodb 和 myisam 的索引结构
(1) 聚集索引[innodb存储引擎的特点,myisam不支持]
如果有主键,自动以主键创建聚集索引的数据结构(树状结构)
如果没有主键,选择唯一键
都没有,自动生成隐藏的聚集索引,也会分出一个字段占用6个字节长整型;
叶子节点上面直接存储真实数据(索引和数据捆绑在一起)
分支节点存储的是索引的最小值,用来划分范围
在数据量变大的时候,尽量在树层级高度不变的情况下,横向发展,好处:查询次数少,提升效率,减少io阻塞;
(2) 非聚集索引(辅助索引,二级索引,普通索引)
先对创建索引的该字段划分区间进行排序,把索引值分布在叶子节点上
存储的是该字段的值以及对应映射出的主键id(primary key ),没有存真实数据
通过主键id,再去从其他文件中找数据..
(3) 两者区别
myisam 和 innodb 使用的索引结构都是b+树,但是叶子节点存储的数据不同
innodb文件结构中只有frm和ibd 直接把数据存在叶子节点上
myisam文件结构中有frm,myi,myd,叶子节点上存储的索引值,通过索引找id,通过id找数据.
(4) 性能优化:
利用索引查询时,可以增快查询速度,但是增删改速度变慢,会改变树状结构
追求尽量让叶子节点存储的数据类型小一点,让高度变矮,让数据页变少.
索引
1.常用索引
2.应用场景
3.不同的存储引擎支持的数据结构
4.建立索引
(1) 方法1,建表的时候,直接创建索引 index 索引名(索引字段)
(2) 方法2,建表之后,创建索引 create index 索引名 on 表名(索引字段)
(3) 方法3,改字段变索引 alter table 表名 add index 索引名(索引字段)
(4) 删除索引
5.正确使用索引
(1) 把频繁作为搜索条件的字段作为索引,查单条数据,如果查询的是一个大范围中的数据,不能命中索引
(2) 选一个区分度较高的字段作索引
(3) 在搜索条件中,不能让索引字段参与计算,不能命中索引
(4) 条件当中含有and , sql语句会通过优化器进行优化
(5) 联合索引 : 遵循最左前缀原则 index(字段1,字段2, ....)
(6) 其他
数据类型不匹配,不能命中索引
使用了函数不能命中
6. 总结
发现加索引和不加索引速度差别巨大,
加了索引之后,ibd文件变大