Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 3daa8f8

Browse filesBrowse files
authored
Update 高性能实践篇.md
1 parent 79051d3 commit 3daa8f8
Copy full SHA for 3daa8f8

File tree

Expand file treeCollapse file tree

1 file changed

+21
-7
lines changed
Open diff view settings
Filter options
Expand file treeCollapse file tree

1 file changed

+21
-7
lines changed
Open diff view settings
Collapse file

‎docs/高性能实践篇.md‎

Copy file name to clipboardExpand all lines: docs/高性能实践篇.md
+21-7Lines changed: 21 additions & 7 deletions
  • Display the source diff
  • Display the rich diff
Original file line numberDiff line numberDiff line change
@@ -168,8 +168,7 @@ MySQL数据库提供的功能很全面,但并不是所有的功能性能都高
168168

169169
存储字节越小,占用空间越小。尽量选择合适的整型,如下图所示。
170170

171-
<img src="C:\Users\吕明辉\AppData\Roaming\Typora\typora-user-images\各字节类型占用的空间.png" style="zoom:80%;" />
172-
171+
<img src="https://github.com/lvminghui/Java-Notes/blob/master/docs/typora-user-images/各字节类型占用的空间.png" style="zoom: 80%;" />
173172
建议:
174173

175174
* 主键列,无负数,建议使用INTUNSIGNED或者BIGINTUNSIGNED;预估字段数字取值会超过42亿,使用BIGINT类型。
@@ -243,8 +242,7 @@ InnoDB自适应哈希索引是为了提升查询效率,InnoDB存储引擎会
243242

244243
如下图所示为一个简单的、标准的 B+tree,每个节点有 K 个键值和 K+1 个指针。
245244

246-
<img src="C:\Users\吕明辉\AppData\Roaming\Typora\typora-user-images\B+树.png" style="zoom:80%;" />
247-
245+
<img src="https://github.com/lvminghui/Java-Notes/blob/master/docs/typora-user-images/B+树.png" style="zoom: 80%;" />
248246
B+Tree索引能够快速访问数据,就是因为存储引擎可以不再需要通过全表扫描来获取数据,而是从索引的根结点(通常在内存中)开始进行二分查找,根节点的槽中都存放了指向子节点的指针,存储引擎根据这些指针能快速遍历数据。
249247

250248
叶子节点存放的 <key+data> ,对于真正要存放哪些数据还得取决于该 B+Tree 是聚簇索引(Clustered Index)还是辅助索引(Secondary Index)。
@@ -377,9 +375,7 @@ Range使用了records_in_range函数估算每个值范围的rows,结果依赖
377375
### 案例二
378376

379377
优化前有一个索引idx_global_id。图中的这条SQL语句的where条件包括一个sub_id的等值查询和一个global_id的范围查询。执行一次需要2.37秒。从下一页的执行计划中,我们可以看到虽然查询优化器使用了唯一索引uniq_subid_globalid,但是由于idx_global_id的干扰,实际只使用了前面的4个长度就access,剩余8个长度都被filter了。
380-
381-
<img src="C:\Users\吕明辉\AppData\Roaming\Typora\typora-user-images\查询优化.png" style="zoom:80%;" />
382-
378+
<img src="https://github.com/lvminghui/Java-Notes/blob/master/docs/typora-user-images/查询优化.png" style="zoom: 80%;" />
383379
从优化后的执行计划中可以看到,使用了forceindex来强制使用唯一索引。正如上文列举的,相似的命令还有ignoreindex忽略索引,straght_join强制优化器按特定的顺序使强制优化器按特定的顺序使用数据表,high_priority 或 low_priority 两个命令来控制 SQL 的执行优先权。
384380

385381
### ICP,MRR,BKA
@@ -434,6 +430,24 @@ MySQL 可以通过设置一些参数,将运行时间长或者非索引查找
434430
* 参数 log_throttle_queries_not_using_indexes,表示每分钟记录到慢查询文件中未使用索引的 SQL 语句上限,0 表示没限制。
435431
* 参数 max_execution_time,用来控制 SELECT 语句的最大执行时间,单位毫秒,超过此值MySQL 自动 kill 掉该查询。
436432

433+
434+
435+
<img src="https://github.com/lvminghui/Java-Notes/blob/master/docs/typora-user-images/慢查询例子.png" style="zoom: 80%;" />
436+
如上图所示是一个慢查询的例子,通过这个例子你可以看到慢查询文件中记录了哪些信息。包括了慢SQL产生的时间,SQL源自的IP和对应的数据库用户名,以及访问的数据库名称;查询的总耗时,被lock 的时间,结果集行数,扫描的行数,以及字节数等。当然还有具体的 SQL 语句。
437+
438+
分析慢查询常用的工具有:
439+
440+
explain;
441+
442+
Mysql dump slow,官方慢查询分析工具;
443+
444+
pt-query-digest,Percona公司开源的慢查询分析工具;
445+
446+
vc-mysql-sniffer,第三方的慢查询抓取工具;
447+
448+
pt-kill,Percona公司开源的慢查询kill工具,常用于生产环境的过载保护。
449+
450+
这里重点介绍pt-query-digest,它是用于分析MySQL慢查询的一个常用工具,先对查询语句的条件进行参数化,然后对参数化以后的查询进行分组统计,统计出各查询的执行时间、次数、占比等,同时把分析结果输出到文件中。也可以结合 Anemometer 工具将慢查询平台化展示。
437451
## 如何优化SQL
438452

439453
1. 全表扫描还是索引扫描。对于小表来说,二者IO调用次数和返回时间相差不大;但对于大表,如果全表扫描,那么查询返回的时间就会很长,就需要使用索引扫描加快查询速度。但并不是要求DBA根据每一种查询条件组合都要创建索引,索引过多也会降低写入和修改的速度,而且如果导致表数据和索引数据比例失调,也不利于后期的正常维护。

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.