#DRDS 全局二级索引 (Global Secondary Index, GSI)
###一、版本限制
MySQL 版本 >= 5.7, 并且 DRDS 版本 >= 5.4.1
###二、 基本原理
1、主表+索引表(每个GSI对应一张索引表)-》下发到每一个分库中
2、写=》如何保证分库一致的?通过XA事务
3、读=》先读索引表,查询列中索引表的覆盖列全部包括,直接返回索引表数据,否则回表处理(回查主表取得缺失列的值)
###三、 使用
1、创建
DRDS 对 MySQL DDL 语法进行了扩展,增加定义 GSI 的语法。使用方式与在 MySQL 上创建索引一致:
建表时定义 GSI
其中:
索引名 :作为索引表的名字,用于创建索引表
索引列 :索引表的分库分表键,即索引分库分表子句中用到的所有列
覆盖列 :索引表中的其他列,默认包含主键和主表的全部分库分表键
索引分库分表子句 :索引表的分库分表算法,与 CREATE TABLE 中分库分表子句的语法一致
2、 使用
1)通过 HINT 指定索引
FORCE INDEX({index_name})
/+TDDL:INDEX({table_name/table_alias}, {index_name})/
IGNORE INDEX与USE INDEX 不使用那些索引、使用那些索引
2)索引选择
对于带有全局二级索引的主表查询,DRDS会自动选择出优化器认为代价最低的索引表。(目前只支持覆盖索引选择)
!!#ff0000 *特别要注意在使用的时候有一些限制和约定(DML、DDL)!!
###四、 FAQ
1、 全局二级索引解决什么问题?
如果查询的维度与逻辑表的拆分维度不同,会产生跨分片查询。随着跨分片查询增多,会产生查询卡慢、连接池耗尽等性能问题。GSI 通过增加拆分维度来减少跨分片查询,消除性能瓶颈,创建 GSI 时需要注意选择与主表不同的分库分表键。
2、 全局二级索引和局部索引的关系?
局部索引: 分布式数据库中,如果数据行和对应的索引行保存在相同分片上,称这种索引为局部索引。DRDS 中特指物理表上的 MySQL 二级索引
全局二级索引: 不同于局部索引,如果数据行和对应的索引行保存在不同分片上,称这种索引为全局二级索引,主要用于快速确定查询涉及的数据分片
两者的关系: 需要搭配使用,DRDS 通过 GSI 将查询下发到单个分片后,该分片上的局部索引能够提升分片内的查询性能。
###五、 性能对比
####压测工具
ab -c 100 -n 10000 -k url
####执行流程
api->userRpc->db
####测试流程
SELECT COUNT() FROM users; !!#ff0000 COUNT():10w+!!
1、 读取一行数据(select *)
1)drds(5.6.29-TDDL-5.3.7-15460044)主表执行
执行的sql:
!!#0000ff SELECT * FROM users WHERE mobile=’;!!
joex@joexdembp ~ % ab -c 100 -n 10000 http://127.0.0.1/
This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests
Server Software: swoole-http-server
Server Hostname: 127.0.0.1
Server Port: 80
Document Path: /
Document Length: 353 bytes
Concurrency Level: 100
Time taken for tests: 12.148 seconds
Complete requests: 10000
Failed requests: 0
Total transferred: 7130000 bytes
HTML transferred: 3530000 bytes
Requests per second: 823.16 [#/sec] (mean)
Time per request: 121.483 [ms] (mean)
Time per request: 1.215 [ms] (mean, across all concurrent requests)
Transfer rate: 573.16 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.3 0 5
Processing: 42 119 42.8 111 766
Waiting: 41 119 42.8 111 766
Total: 42 120 42.8 112 766
Percentage of the requests served within a certain time (ms)
50% 112
66% 123
75% 133
80% 139
90% 160
95% 184
98% 242
99% 321
100% 766 (longest request)
2)drds(5.6.29-TDDL-5.3.7-15460044)冗余表索引+主表缺失列回查执行
执行的sql:
!!#0000ff SELECT * FROM redundance_mobile WHERE mobile=’’;!!
!!#0000ff SELECT * FROM users WHERE uid=;!!
joex@joexdembp ~ % ab -c 100 -n 10000 http://127.0.0.1/
This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests
Server Software: swoole-http-server
Server Hostname: 127.0.0.1
Server Port: 80
Document Path: /
Document Length: 353 bytes
Concurrency Level: 100
Time taken for tests: 19.521 seconds
Complete requests: 10000
Failed requests: 0
Total transferred: 7130000 bytes
HTML transferred: 3530000 bytes
Requests per second: 512.28 [#/sec] (mean)
Time per request: 195.207 [ms] (mean)
Time per request: 1.952 [ms] (mean, across all concurrent requests)
Transfer rate: 356.69 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.3 0 7
Processing: 57 192 101.8 155 824
Waiting: 56 192 101.7 155 824
Total: 60 192 101.8 155 824
Percentage of the requests served within a certain time (ms)
50% 155
66% 171
75% 185
80% 199
90% 391
95% 440
98% 478
99% 514
100% 824 (longest request)
3)drds(5.6.29-TDDL-5.4.4-15864860)全局二级索引执行
执行的sql:
!!#0000ff SELECT * FROM users WHERE mobile=’’;!!
joex@joexdembp ~ % ab -c 100 -n 10000 http://127.0.0.1/
This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests
Server Software: swoole-http-server
Server Hostname: 127.0.0.1
Server Port: 80
Document Path: /
Document Length: 353 bytes
Concurrency Level: 100
Time taken for tests: 14.018 seconds
Complete requests: 10000
Failed requests: 0
Total transferred: 7130000 bytes
HTML transferred: 3530000 bytes
Requests per second: 713.37 [#/sec] (mean)
Time per request: 140.181 [ms] (mean)
Time per request: 1.402 [ms] (mean, across all concurrent requests)
Transfer rate: 496.71 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 1.8 0 181
Processing: 27 139 49.4 127 451
Waiting: 22 139 49.3 127 451
Total: 28 139 49.4 127 451
Percentage of the requests served within a certain time (ms)
50% 127
66% 141
75% 152
80% 161
90% 210
95% 257
98% 287
99% 302
100% 451 (longest request)
|ab并发和请求数|数据库环境|执行时间(5次平均值)|QPS(每秒请求数)(5次平均值)|
|100并发,10000请求|drds(5.6.29-TDDL-5.3.7-15460044)主表执行|14.62 seconds|713|
||100并发,10000请求||drds(5.6.29-TDDL-5.3.7-15460044)冗余表索引+主表缺失列回查执行|| 19.77 seconds||514||
||100并发,10000请求||drds(5.6.29-TDDL-5.4.4-15864860)全局二级索引|| 17.18 seconds||592||
2、 读取一行数据(select uid mobile)查询二级索引/索引表(不回表)
1)drds(5.6.29-TDDL-5.3.7-15460044)冗余表
执行的sql:
!!#0000ff SELECT uid,mobile FROM redundance_mobile WHERE mobile=’’;!!
joex@joexdembp ~ % ab -c 100 -n 10000 http://127.0.0.1/
This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests
Server Software: swoole-http-server
Server Hostname: 127.0.0.1
Server Port: 80
Document Path: /
Document Length: 353 bytes
Concurrency Level: 100
Time taken for tests: 15.822 seconds
Complete requests: 10000
Failed requests: 0
Total transferred: 7130000 bytes
HTML transferred: 3530000 bytes
Requests per second: 632.03 [#/sec] (mean)
Time per request: 158.221 [ms] (mean)
Time per request: 1.582 [ms] (mean, across all concurrent requests)
Transfer rate: 440.07 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 1.8 0 178
Processing: 67 155 46.4 147 879
Waiting: 67 155 46.4 147 879
Total: 67 156 46.5 147 880
Percentage of the requests served within a certain time (ms)
50% 147
66% 160
75% 168
80% 175
90% 193
95% 216
98% 323
99% 365
100% 880 (longest request)
2)drds(5.6.29-TDDL-5.4.4-15864860)全局二级索引
执行的sql:
!!#0000ff SELECT uid,mobile FROM users WHERE mobile=’’;!!
joex@joexdembp ~ % ab -c 100 -n 10000 http://127.0.0.1/
This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests
Server Software: swoole-http-server
Server Hostname: 127.0.0.1
Server Port: 80
Document Path: /
Document Length: 90 bytes
Concurrency Level: 100
Time taken for tests: 12.937 seconds
Complete requests: 10000
Failed requests: 0
Total transferred: 4490000 bytes
HTML transferred: 900000 bytes
Requests per second: 773.00 [#/sec] (mean)
Time per request: 129.366 [ms] (mean)
Time per request: 1.294 [ms] (mean, across all concurrent requests)
Transfer rate: 338.94 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 17.5 0 1753
Processing: 26 128 180.5 100 1989
Waiting: 26 128 180.5 99 1989
Total: 31 129 181.4 100 1989
Percentage of the requests served within a certain time (ms)
50% 100
66% 116
75% 128
80% 136
90% 169
95% 243
98% 313
99% 1789
100% 1989 (longest request)
||~ ab并发和请求数||数据库环境||执行时间(5次平均值)||QPS(每秒请求数)(5次平均值)||
||100并发,10000请求||drds(5.6.29-TDDL-5.3.7-15460044)|| 17.44 seconds||587||
||100并发,10000请求||drds(5.6.29-TDDL-5.4.4-15864860)全局二级索引|| 12.18 seconds||830||
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WTtqoiEW-1586768686639)(/tfl/captures/2020-04/tapd_38981207_base64_1586765666_50.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ntlWYqKS-1586768686639)(/tfl/captures/2020-04/tapd_38981207_base64_1586766337_18.png)]
3、 插入数据
1)drds(5.6.29-TDDL-5.3.7-15460044)主表+冗余表
joex@joexdembp ~ % ab -c 100 -n 10000 http://127.0.0.1/
This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests
Server Software: swoole-http-server
Server Hostname: 127.0.0.1
Server Port: 80
Document Path: /
Document Length: 162 bytes
Concurrency Level: 100
Time taken for tests: 418.928 seconds
Complete requests: 10000
Failed requests: 8842
(Connect: 0, Receive: 0, Length: 8842, Exceptions: 0)
Total transferred: 5230254 bytes
HTML transferred: 1630254 bytes
Requests per second: 23.87 [#/sec] (mean)
Time per request: 4189.277 [ms] (mean)
Time per request: 41.893 [ms] (mean, across all concurrent requests)
Transfer rate: 12.19 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.3 0 4
Processing: 845 4161 672.7 4231 7236
Waiting: 842 4161 672.7 4231 7236
Total: 846 4162 672.7 4232 7236
Percentage of the requests served within a certain time (ms)
50% 4232
66% 4491
75% 4632
80% 4725
90% 4948
95% 5122
98% 5375
99% 5656
100% 7236 (longest request)
2)drds(5.6.29-TDDL-5.4.4-15864860)全局二级索引 主表
joex@joexdembp ~ % ab -c 100 -n 10000 http://127.0.0.1/
This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests
Server Software: swoole-http-server
Server Hostname: 127.0.0.1
Server Port: 80
Document Path: /
Document Length: 57 bytes
Concurrency Level: 100
Time taken for tests: 10.948 seconds
Complete requests: 10000
Failed requests: 0
Total transferred: 4160000 bytes
HTML transferred: 570000 bytes
Requests per second: 913.39 [#/sec] (mean)
Time per request: 109.482 [ms] (mean)
Time per request: 1.095 [ms] (mean, across all concurrent requests)
Transfer rate: 371.06 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.4 0 11
Processing: 38 108 43.8 99 605
Waiting: 38 107 43.8 98 600
Total: 38 108 43.8 99 605
Percentage of the requests served within a certain time (ms)
50% 99
66% 111
75% 120
80% 126
90% 148
95% 178
98% 264
99% 313
100% 605 (longest request)
||~ ab并发和请求数||数据库环境||执行时间(5次平均值)||QPS(每秒请求数)(5次平均值)||
||100并发,10000请求||drds(5.6.29-TDDL-5.3.7-15460044)|| 24 seconds||408.55||
||100并发,10000请求||drds(5.6.29-TDDL-5.4.4-15864860)全局二级索引|| 11.808 seconds||856||
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AqhVqhsc-1586768686640)(/tfl/captures/2020-04/tapd_38981207_base64_1586765507_87.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iQN9GcAt-1586768686640)(/tfl/captures/2020-04/tapd_38981207_base64_1586765286_61.png)]
####结论
目前的结论是基于数据量在10W左右
1、在查询(SELECT * )查询所有列时:直接查询主表-未建全局二级索引的执行时间和QPS是 最优的 ;查询查询主表-建立全局二级索引的执行时间和QPS次之,应该是因为查询了索引表后进行了回表;而自建冗余表索引+主表缺失列回查执行和全局二级索引原理类似,执行效率也是差不多。
2、在查询 (select uid mobile)全局二级索引/自写冗余索引表(不回表)时:全局二级索引比自写冗余索引表的优势明显。
3、插入数据:主表+写冗余索引表和全局二级索引的对比,全局二级索引优势更加明显。
4、GSI综合比较下来比自写冗余索引表方式效率更优,但考虑目前GSI在DML、DDL下有一定的限制与约定,所以在替换自写冗余索引表的时候得评估下限制与约定是否会造成影响。