点击上方SQL数据库开发,关注获取SQL视频教程

SQL专栏

SQL数据库基础知识汇总

SQL数据库高级知识汇总

唐成勇

https://segmentfault.com/a/1190000013746118


一、数据库结构优化

1.1 数据库结构优化目的

  1. 减少数据冗余:(数据冗余是指在数据库中存在相同的数据,或者某些数据可以由其他数据计算得到),注意,尽量减少不代表完全避免数据冗余;

  2. 尽量避免数据维护中出现更新,插入和删除异常:

    总结:要避免异常,需要对数据库结构进行范式化设计。

  3. 节约数据存储空间。

  4. 提高查询效率。

1.2 数据库结构设计步骤

  1. 需求分析:全面了解产品设计的存储需求、数据处理需求、数据安全性与完整性;

  2. 逻辑设计(重要):设计数据的逻辑存储结构。数据实体之间的逻辑关系,解决数据冗余和数据维护异常。数据范式可以帮助我们设计;

  3. 物理设计:表结构设计,存储引擎与列的数据类型;

  4. 维护优化:索引优化、存储结构优化。

1.3 物理设计

二、高可用架构设计

2.1 读写分离

三、数据库索引优化

3.1 两种主要数据结构:B-tree和Hash

3.1.1 B-tree结构

B-tree索引的限制:

3.1.2 Hash结构

Hash索引的限制:

  • Hash索引必须进行二次查找

  • Hash索引无法用于排序

  • Hash索引不支持部分索引查找也不支持范围查找

  • Hash索引中Hash码的计算可能存在Hash冲突,不适合重复值很高的列,如性别,身份证比较合适。

3.1.3 MySQL常见索引和各种索引区别

--PRIMARY KEY(主键索引)
ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )
--UNIQUE(唯一索引)
ALTER TABLE `table_name` ADD UNIQUE (`column`) INDEX(普通索引)
ALTER TABLE `table_name` ADD INDEX index_name ( `column` )
--FULLTEXT(全文索引)
ALTER TABLE `table_name` ADD FULLTEXT (`column`)
--组合索引
ALTER TABLE `table_name` ADD INDEX index_name (`column1`, `column2`, `column3`)
  1. 普通索引:最基本的索引,没有任何限制

  2. 唯一索引:与"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。

  3. 主键索引:它 是一种特殊的唯一索引,不允许有空值。

  4. 全文索引:仅可用于 MyISAM 表,针对较大的数据,生成全文索引很耗时好空间。

  5. 组合索引:为了更多的提高mysql效率可建立组合索引,遵循”最左前缀“原则。

3.2 使用索引好处和索引缺陷

3.2.1 为什么要使用索引

  1. 索引大大减少了存储引擎需要扫描的数据量;

  2. 索引可以帮助我们进行排序以避免使用临时表;

  3. 索引可以把随机I/O变为顺序I/O。

3.2.2 索引不是越多越好

  1. 索引会增加写操作的成本;

  2. 太多的索引会增加查询优化器的选择时间。

索引就好比一本书的目录,它会让你更快的找到内容,显然目录(索引)并不是越多越好,假如这本书1000页,而有500页是目录,它当然效率低,目录是要占纸张的,而索引是要占磁盘空间的。

3.3 索引优化策略

3.3.1 索引列上不能使用表达式和函数

3.3.2 前缀索引和索引列的选择性

Innodb索引列最大宽度为667个字节(utf-8 差不多255个字符),MyIsam索引类宽度最大为1000个字节,于是出现前缀索引,索引的选择性。

对于列的值较长,比如BLOB、TEXT、VARCHAR,就必须建立前缀索引,即将值的前一部分作为索引。这样既可以节约空间,又可以提高查询效率。但无法使用前缀索引做 ORDER BY 和 GROUP BY,也无法使用前缀索引做覆盖扫描。

语法: ALTER TABLE table_name ADD KEY(column_name(prefix_length))

如何选择索引列的顺序:

  1. 经常会被使用到的列优先(选择性差的列不适合,如性别,查询优化器可能会认为全表扫描性能更好);

  2. 选择性高的列优先;

  3. 宽度小的列优先(一页中存储的索引越多,降低I/O,查找越快);

3.3.3 组合/联合索引策略

如果索引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始并且不跳过索引中的列。

3.3.4 覆盖索引策略

跟组合索引有点类似,如果索引包含所有满足查询需要的数据的索引则成为覆盖索引(Covering Index),也就是平时所说的不需要回表操作。即索引的叶子节点上面包含了他们索引的数据(hash索引不可以)。

判断标准:使用explain,可以通过输出的extra列来判断,对于一个索引覆盖查询,显示为using index,MySQL查询优化器在执行查询前会决定是否有索引覆盖查询。

优点:

  1. 可以优化缓存,减少磁盘IO操作;

  2. 可以减少随机IO,变随机IO操作变为顺序IO操作;

  3. 可以避免对InnoDB主键索引的二次查询;

  4. 可以避免MyISAM表进行系统调用;

无法使用覆盖索引的情况:

  1. 存储引擎不支持覆盖索引;

  2. 查询中使用了太多的列(如SELECT * );

  3. 使用了双%号的like查询(底层API所限制);

3.3.5 SQL索引优化总结口诀(套路重点)

全值匹配我最爱,最左前缀要遵守;

3.4 使用索引来优化查询

3.4.1 利用索引排序

  1. group by 实质是先排序后分组,遵照索引的最佳左前缀。;

  2. 索引中所有列的方向(升序、降序)和Order By子句完全一致;

  3. 当无法使用索引列,增大max_length_for_sort_data参数的设置+增大sort_buffer_size参数的设置;

  4. 如果最左列使用了范围,则排序会失效;

  5. where 高于having,能写在where限定的条件就不要去having去限定了

3.5 索引的维护和优化

3.5.1 删除重复索引

注:主键约束相当于(唯一约束 + 非空约束)

一张表中最多有一个主键约束,如果设置多个主键,就会出现如下提示:Multiple primary key defined!!!

3.5.2 删除冗余索引

推荐阅读

(点击标题可跳转阅读)

公众号内回复1,拉你进微信交流群

长按下方二维码加入我们的SQL训练营

点击"阅读原文",了解SQL训练营

分分钟解决 MySQL 查询速度慢与性能差(中)相关推荐

  1. 大牛出招|分分钟解决 MySQL 查询速度慢与性能差

    点击▲关注 "数据和云"   给公众号标星置顶 更多精彩 第一时间直达 作者:唐立勇 https://segmentfault.com/a/1190000013672421 一.什 ...

  2. mysql 查看表v空间自增涨_分分钟解决MySQL查询速度慢与性能差

    阅读本文大概需要 6 分钟. 一.什么影响了数据库查询速度 1.1 影响数据库查询速度的四个因素 1.2 风险分析 QPS: QueriesPerSecond意思是"每秒查询率", ...

  3. mysql 查看表v空间自增涨_分分钟解决 MySQL 查询速度慢与性能差

    专注于Java领域优质技术号,欢迎关注 作者:唐立勇 一.什么影响了数据库查询速度 1.1 影响数据库查询速度的四个因素 1.2 风险分析 QPS: QueriesPerSecond意思是" ...

  4. oracle锁表查询_专业解决 MySQL 查询速度慢与性能差

    Java识堂,一个高原创,高收藏,有干货的微信公众号,一起成长,一起进步,欢迎关注 什么影响了数据库查询速度 1.1 影响数据库查询速度的四个因素 1.2 风险分析 QPS: QueriesPerSe ...

  5. 专业解决 MySQL 查询速度慢与性能差!

    作者:唐立勇 https://segmentfault.com/a/1190000013672421 什么影响了数据库查询速度 1.1 影响数据库查询速度的四个因素 1.2 风险分析 QPS: Que ...

  6. mysql 查看表v空间自增涨_专业解决 MySQL 查询速度慢与性能差!

    一.什么影响了数据库查询速度 1.1 影响数据库查询速度的四个因素 1.2 风险分析 QPS:Queries Per Second意思是"每秒查询率",是一台服务器每秒能够相应的查 ...

  7. MySQL 查询速度慢与性能差的原因与解决方法

    MySQL 查询速度慢与性能差的原因与解决方法 更新时间:2019年09月26日 18:05:47 作者:Microtiger 随着网站数据量与访问量的增加,MySQL 查询速度慢与性能差的问题就日渐 ...

  8. 6条策略提高mysql查询速度 潇湘博客

    6条策略提高mysql查询速度 1,表设计一定要优化,冗余数据最少,少用连接查询.如果在实际应用中,使用了极其复杂的连接,子查询,则数据表的设计得要重新考虑了. 2,尽量用char而不是varchar ...

  9. oracle mysql查询速度慢_oracle 根据时间范围查询缓慢问题排查解决

    今天生产环境上碰到个奇怪问题,在oracle数据库一个根据时间范围的查询语句居然执行了二十多分钟.一开始打印了执行sql日志之后就毫无反应了,任何错误都没有.把进程反复重启几次也一样.直到二十分钟后就 ...

最新文章

  1. ECSHOP学习笔记
  2. 数据挖掘入门指南!!!
  3. 《LeetCode力扣练习》第136题 只出现一次的数字 Java
  4. Lucene-Analyzer
  5. 前谷歌工程团队负责人:如何打造一个完美的产品
  6. 当下python的主流版本是_Python 版本调查发现 3.x 增长 8.2%,2.7 依然是主流 (你在用哪版)...
  7. 牛顿法与拟牛顿法,SDM方法的一些注记
  8. Gradle入门:创建二进制分发
  9. 【面向对象】面向对象技术核心内容归纳总结
  10. [Linux]文件的atime ctime mtime
  11. 程序员如何开启机器学习之路
  12. python打开文件夹中的tiff_浅谈python下tiff图像的读取和保存方法
  13. 为什么你的MySQL跑得很慢?
  14. 超全SQL注入实用语句
  15. QTreeView+自定义Model实现示例
  16. Java常见设计模式
  17. Shell脚本之shift用法
  18. 银行贷款与网上借贷比较
  19. 利用Cam对Hopenet网络模型进行可视化
  20. 微信小程序搭建项目起步

热门文章

  1. 煽情的儿子521=随笔
  2. linux没有.brashrc文件,RHCE认证学习笔记-第四天
  3. 大熊课堂python资源_大熊课堂 - 主页
  4. 【满分】【华为OD机试真题2023 JAVA】 打印文件
  5. python从字符串中提取指定内容
  6. 软件工程项目——校园二手交易系统——第一部分需求规格说明书
  7. mac 黑苹果使用,触控板2突然无反应
  8. 从底层到算法 — 2020年最全的大厂面试题
  9. 认真学习MySQL中的MVCC机制
  10. html清空按钮代码,HTML DOM console.clear()用法及代码示例