<返回更多

SQL 性能优化,太太太太太太太有用了

2020-03-13    
加入收藏

本文主要针对的是关系型数据数据库 MySQL

先简单梳理下 Mysql 的基本概念,然后分创建时和查询时这两个阶段的优化展开。

1 基本概念简述

1.1 逻辑架构

SQL 性能优化,太太太太太太太有用了

 

1.2 锁

数据库通过锁机制来解决并发场景 - 共享锁(读锁)和排他锁(写锁)。读锁是不阻塞的,多个客户端可以在同一时刻读取同一个资源。写锁是排他的,并且会阻塞其他的读锁和写锁。简单提下乐观锁和悲观锁。

要锁定数据需要一定的锁策略来配合。

但是 MySql 的存储引擎的真实实现不是简单的行级锁,一般都是实现了多版本并发控制(MVCC)。MVCC 是行级锁的变种,多数情况下避免了加锁操作,开销更低。MVCC 是通过保存数据的某个时间点快照实现的。

1.3 事务

事务保证一组原子性的操作,要么全部成功,要么全部失败。一旦失败,回滚之前的所有操作。MySql 采用自动提交,如果不是显式的开启一个事务,则每个查询都作为一个事务。

隔离级别控制了一个事务中的修改,哪些在事务内和事务间是可见的。四种常见的隔离级别:

1.4 存储引擎

InnoDB 引擎,最重要,使用最广泛的存储引擎。被用来设计处理大量短期事务,具有高性能和自动崩溃恢复的特性。

MyISAM 引擎,不支持事务和行级锁,崩溃后无法安全恢复。

2 创建时优化

2.1 Schema 和数据类型优化

整数

TinyInt,SmallInt,MediumInt,Int,BigInt 使用的存储 8,16,24,32,64 位存储空间。使用 Unsigned 表示不允许负数,可以使正数的上线提高一倍。

实数

字符串

时间类型

优化建议点

2.2 索引

索引包含一个或多个列的值。MySql 只能高效的利用索引的最左前缀列。索引的优势:

B-Tree

使用最多的索引类型。采用 B-Tree 数据结构来存储数据(每个叶子节点都包含指向下一个叶子节点的指针,从而方便叶子节点的遍历)。B-Tree 索引适用于全键值,键值范围,键前缀查找,支持排序。

B-Tree 索引限制:

哈希索引

只有精确匹配索引的所有列,查询才有效。存储引擎会对所有的索引列计算一个哈希码,哈希索引将所有的哈希码存储在索引中,并保存指向每个数据行的指针。

哈希索引限制:

优化建议点

3 查询时优化

3.1 查询质量的三个重要指标

3.2 查询优化点

SELECT id, NAME, ageWHERE student s1INNER JOIN ( SELECT     id FROM     student ORDER BY     age LIMIT 50,5) AS s2 ON s1.id = s2.id

补充内容

来自大神 - 小宝

  1. 条件中的字段类型和表结构类型不一致,mysql 会自动加转换函数,导致索引作为函数中的参数失效。

2.like 查询前面部分未输入,以 % 开头无法命中索引。

  1. 补充 2 个 5.7 版本的新特性:

generated column,就是数据库中这一列由其他列计算而得

CREATE TABLE triangle (sidea DOUBLE, sideb DOUBLE, area DOUBLE AS (sidea * sideb / 2));insert into triangle(sidea, sideb) values(3, 4);select * from triangle;
+-------+-------+------+| sidea | sideb | area |+-------+-------+------+|   3      |   4      |  6     |+-------+-------+------+

支持 JSON 格式数据,并提供相关内置函数

CREATE TABLE json_test (name JSON);INSERT INTO json_test VALUES('{"name1": "value1", "name2": "value2"}');SELECT * FROM json_test WHERE JSON_CONTAINS(name, '$.name1');

来自 JVM 专家 - 达

关注 explain 在性能分析中的使用

EXPLAIN SELECT settleId FROM Settle WHERE settleId = "3679"
SQL 性能优化,太太太太太太太有用了

 

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>