文章插图
一、概述1. 为什么要优化
- 一个应用吞吐量瓶颈往往出现在数据库的处理速度上
- 随着应用程序的使用,数据库数据逐渐增多,数据库处理压力逐渐增大
- 关系型数据库的数据是存放在磁盘上的,读写速度较慢(与内存中的数据相比)
- 表、字段的设计阶段,考量更优的存储和计算
- 数据库自身提供的优化功能,如索引
- 横向扩展,主从复制、读写分离、负载均衡和高可用
- 典型SQL语句优化(收效甚微)
①. 对精度有要求
- decimal
- 小数转整数
- inet_ aton("ip' )
- inet_ ntoa(num)
- nuI数值的计算逻辑比较复杂
- 较长的数字数据可以使用decimal
- char为定长(超过长度的内容将被截掉),varchar为非定长,text对内容 长度的保存额外保存而varchar对长度的保存占用数据空间
2. 范式
①. 第一范式:段原子性(关系型数据库有列的念,默认就符合了)
②. 第二范式:消除对主键的部分依赖(因为主键可能不止一个);使用一 个与业务无关的字段作为主键
③. 第三范式:消除对主键的传递依赖;高内聚, 如商品表可分为商品简略信息表和商品详情表两张表
三、存储引擎的选择(MyISAM和Innodb)1. 功能差异
Innodb支持事务、 行级锁定、外健
2. 存储差异
①. 存储方式:MyISAM的数据和索弓 |是分开存储的(.MYI.MYD),而Innodb是存在一起的(.frm)
②. 表可移动性:可以通过移动表对应的MYI和MYD能够实现表的移动,而Innodb还有 额外的关联文件
③. 碎片空间:MyISAM删除数据时会产生碎片空间(占用表文件空间),需要定期通过optimizetable table-name手动优化 。而Innodb不会 。
④. 有序存储:Innodb插入数据时按照主键有序来插入 。因此表中数据默认按主键有序(耗费写入时间,因为需要在b+ tree中查找插入点,但查找效率高)
3. 选择差异
①. 读多写少用MyISAM:新闻、博客网站
②. 读多写也多用Innodb:
- 支持事务/外键,保证数据-致性、完整性
- 并发能力强(行锁)
从数据中提取的具有标识性的关键字,并且有到对应数据的映射关系
2. 类型
①. 主键索引primary key:要求关键字唯一且不为null
②. 普通索引key:符合索引仅按照第一字段有序
③. 唯一索引unique key:要求关键字唯一
④. 全文索引fulltext key (不支持中文)
3. 索引管理语法
①. 查看索引
- show create table student
- desc student
- 创建时指定,如first. name varchar(1 6),last name(1 6) , key name(first_ name,last_ name)
- 更改表结构:alter table student add key/unique key/primary key/ultext key key. name(first_ name,last_ name)
- alter table student drop key key_ name
- 如果删除的是主键索引,并且主键自增长,则需要alter modify先取消自增长再删除
分析SQL执行是否用到了索引,用到了什么索引
5. 索引使用的场景
- where:如果查找字段都建立了索引,则会索引覆盖
- order by:如果排序字段建立了索引,而索引又是有序排列的,直接根据索引拿对应数据即可,与读取查询出来的所有数据再排序相比效率很高
- join:如果join on的条件字段建立了索引,查找会变得高效
- 索引覆盖:直接对索引做查找,而不去读取数据
即使建立了索引,有些场景也不一定使用
- where id+1 = ?建议写成where id = ?-1,即保证索弓|字段的独立出现
- like语句不要在关键字前模糊匹配,即"%keyword不会使用索引,而"keyword% 会使用索引
- or关键两边条件字段都建立索引时才会使用索引,只要有一边不是就会做全表扫描
- 状态值 。像性别这样的状态值,-个关键字对应很多条数据,会认为使用索引比全表扫描效率还低
- btree:搜索多叉树:结点内关键字有序排列,关键字之间有一个指针,查找效率log(nodeSize,N),其中nodeSize指一 个结点内关键字数量 (这取决于关键字长度和结点大小)
推荐阅读
- 你值得了解——浅析顾渚紫笋茶在中国贡茶史上的地位
- 中国历史上18位奇珍美女 中国古代美女图
- 史上最大的蚂蚁有多大 世界上最大的蚂蚁有几厘米
- 其绝技被称柔道史上最大秘技 柔道十段
- |DNF:史上最逆天的太刀,竟用红眼专属技能命名,能瞬杀任何boss
- 最可怕的怪物 史上最恐怖的十大怪物
- 历时100天终于整理了所有Python库!助你成为年薪百万大佬
- 史上唯御笔著茶书,赵佶茶论
- 史上最全Linux服务器程序规范
- 史上最通俗分布式锁解读