关于数据库:实践教程之如何在-PolarDBX-中优化慢-SQL

33次阅读

共计 3812 个字符,预计需要花费 10 分钟才能阅读完成。

PolarDB-X 为了不便用户体验,提供了收费的试验环境,您能够在试验环境里体验 PolarDB-X 的装置部署和各种内核个性。除了收费的试验,PolarDB-X 也提供收费的视频课程,手把手教你玩转 PolarDB-X 分布式数据库。

本期试验将领导您应用对 PolarDB-X 进行慢 SQL 优化。

本期收费试验地址

本期教学视频地址

前置筹备

假如曾经依据前一讲内容实现了 PolarDB- X 的搭建部署,能够胜利链接上 PolarDB- X 数据库。

启动业务

本步骤将领导您如何应用 Sysbench Select 场景模仿业务流量。

筹备压测数据

a. 执行如下 SQL 语句,创立压测数据库 sysbench_test。

CREATE DATABASE sysbench_test;

b. 执行如下 SQL 语句,应用压测数据库 sysbench_test。

USE sysbench_test;

c. 在试验页面,单击右上角的 + 图标,创立新的终端三。

d. 执行如下命令,切换到账号 galaxykube。

su galaxykube

e. 执行如下命令,进入到 /home/galaxykube 目录。

cd

f. 执行如下命令,创立筹备压测数据的 sysbench-prepare.yaml 文件。

vim sysbench-prepare.yaml

g. 按 i 键进入编辑模式,将如下代码复制到文件中,而后按 ECS 退出编辑模式,输出:wq 后按下 Enter 键保留并退出。

kind: Job
metadata:
  name: sysbench-prepare-data-test
  namespace: default
spec:
  backoffLimit: 0
  template:
    spec:
      restartPolicy: Never
      containers:
        - name: sysbench-prepare
          image: severalnines/sysbench
          env:
            - name: POLARDB_X_USER
              value: polardbx_root
            - name: POLARDB_X_PASSWD
              valueFrom:
                secretKeyRef:
                  name: polardb-x
                  key: polardbx_root
          command: ['sysbench']
          args:
            - --db-driver=mysql
            - --mysql-host=$(POLARDB_X_SERVICE_HOST)
            - --mysql-port=$(POLARDB_X_SERVICE_PORT)
            - --mysql-user=$(POLARDB_X_USER)
            - --mysql_password=$(POLARDB_X_PASSWD)
            - --mysql-db=sysbench_test
            - --mysql-table-engine=innodb
            - --rand-init=on
            - --max-requests=1
            - --oltp-tables-count=1
            - --report-interval=5
            - --oltp-table-size=160000
            - --oltp_skip_trx=on
            - --oltp_auto_inc=off
            - --oltp_secondary
            - --oltp_range_size=5
            - --mysql_table_options=dbpartition by hash(`id`)
            - --num-threads=1
            - --time=3600
            - /usr/share/sysbench/tests/include/oltp_legacy/parallel_prepare.lua
            - run

h. 执行如下命令,运行筹备压测数据的 sysbench-prepare.yaml 文件,初始化测试数据。

kubectl apply -f sysbench-prepare.yaml

i. 执行如下命令,获取工作进行状态。

kubectl get jobs

返回后果如下,请您急躁期待大概 1 分钟,当工作状态 COMPLETIONS 为 1 / 1 时,示意数据曾经初始化实现。

启动压测流量

a. 执行如下命令,创立启动压测的 sysbench-select.yaml 文件。

vim sysbench-select.yaml

b. 按 i 键进入编辑模式,将如下代码复制到文件中,而后按 ECS 退出编辑模式,输出:wq 后按下 Enter 键保留并退出。

kind: Job
metadata:
  name: sysbench-point-select-k-test
  namespace: default
spec:
  backoffLimit: 0
  template:
    spec:
      restartPolicy: Never
      containers:
        - name: sysbench-point-select-k
          image: severalnines/sysbench
          env:
            - name: POLARDB_X_USER
              value: polardbx_root
            - name: POLARDB_X_PASSWD
              valueFrom:
                secretKeyRef:
                  name: polardb-x
                  key: polardbx_root
          command: ['sysbench']
          args:
            - --db-driver=mysql
            - --mysql-host=$(POLARDB_X_SERVICE_HOST)
            - --mysql-port=$(POLARDB_X_SERVICE_PORT)
            - --mysql-user=$(POLARDB_X_USER)
            - --mysql_password=$(POLARDB_X_PASSWD)
            - --mysql-db=sysbench_test
            - --mysql-table-engine=innodb
            - --rand-init=on
            - --max-requests=0
            - --oltp-tables-count=1
            - --report-interval=5
            - --oltp-table-size=32000000
            - --oltp_skip_trx=on
            - --oltp_auto_inc=off
            - --oltp_secondary
            - --oltp_range_size=5
            - --mysql-ignore-errors=all
            - --num-threads=8
            - --time=3600
            - --random_points=1
            - /usr/share/sysbench/tests/include/oltp_legacy/select_random_points.lua
            - run

c. 执行如下命令,运行启动压测的 sysbench-select.yaml 文件,开始压测。

kubectl apply -f sysbench-select.yaml

d. 执行如下命令,查找压测脚本运行的 POD。

kubectl get pods

返回后果如下,以‘sysbench-point-select-k-test-’结尾的 POD 即为指标 POD。

e. 执行如下命令,查看 QPS 等信息。

阐明:您须要将命令中的指标 POD 替换为以‘sysbench-point-select-k-test-’结尾的 POD。

kubectl logs -f 指标 PO

体验 SQL 限流和 SQL Advisor

SQL 限流

SQL 限流是 PolarDB- X 提供的对合乎特定规定的 SQL 进行限度的性能。在本试验场景中假如步骤二中发动的 Sysbench Select 流量重大影响了其余业务,所以咱们首先用 SQL 限流对 Select SQL 进行限流。

a. 执行如下 SQL 语句,查看以后正在运行的申请。

show full processlist where info is not null

返回后果如下,您可查看到有如下 SQL 正在执行。

b. 执行如下 SQL 语句,创立针对这条 SQL 的限流规定。

create ccl_rule block_select on sysbench_test.* to ‘polardbx_root’@’%’ for select filter by keyword(‘pad’) with max_concurrency=0; 在终端二中执行对 select sql 进行拦挡的 SQL 语句后,在终端三您可查看到呈现大量的 SQL 报错统计。

c. 执行如下 SQL 语句,查看 SQL 限流具体拦挡状况。

show ccl_rules;

返回后果如下,您可查看 SQL 限流具体拦挡状况

用 SQL Advisor 优化慢 SQL

在对慢 SQL 进行限度后,咱们的零碎就能够恢复正常状态了,那么接下来就能够对 SQL 进行优化。PolarDB-X 提供内置的 SQL Advisor 性能,能够针对某条 SQL 给出具体的优化倡议。

a. 执行如下,应用 SQL Advisor 功能分析 SQL 语句。

explain advisor SELECT id, k, c, pad from sbtest1 where k in(10)\G

返回后果如下,在 ADVISE_INDEX 局部,就是 SQL Advisor 给出的倡议。

b. 执行 SQL Advisor 给出的倡议 SQL 语句。

ALTER TABLE sysbench_test.sbtest1 ADD GLOBAL INDEX __advise_index_gsi_sbtest1_k(k) DBPARTITION BY HASH(k);

c. 行如下 SQL 语句,解除 SQL 限流。

drop ccl_rule block_select;

终端二中执行解除 SQL 限流的 SQL 语句后,在终端三您可查看到 qps 在优化后进行了大幅度的晋升。

原文链接

本文为阿里云原创内容,未经容许不得转载。

正文完
 0