您好,登錄后才能下訂單哦!
小編給大家分享一下SQL調優怎么生成海量測試數據,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
場景,如果出現慢SQL,需要DBA加索引優化,怎么知道加的索引是有效的呢?這需要一遍遍的試驗和調整,總不能直接拿線上的數據庫測試吧,一般方法是在測試環境建立測試表,然后從線上的從庫拷貝一些數據進測試環境,接著再進行加索引和explain
但有時候,導出的數據量少,執行計劃看不出效果,導出數據量多,又會沖刷線上機器的buffer pool和影響IO,如果有個工具能夠直接生成數據就好了,生成跟線上一樣的100萬,或者1000萬就好了
以前sysbench壓力測試,有一個生成數據的功能,生成100萬數據是這樣的
sysbench --test=oltp --mysql-table-engine=myisam --oltp-table-size=1000000 \ --mysql-socket=/tmp/mysql.sock --mysql-user=test --mysql-host=localhost \ --mysql-password=test prepare
但它生成表結構是固定的,進行壓力測試的SQL語句也是固定的,無法調試線上的SQL語句
CREATE TABLE `sbtest` ( `id` int(10) unsigned NOT NULL auto_increment, `k` int(10) unsigned NOT NULL default '0', `c` char(120) NOT NULL default '', `pad` char(60) NOT NULL default '', PRIMARY KEY (`id`), KEY `k` (`k`));
能否有一個創建用戶自定義的表結構,并且對這個表結構生成上百千萬數據的工具呢?有一個叫datagen的工具,鏈接在文章末尾
drwxr-xr-x. 2 root mysql 4096 Sep 27 2016 bizsql drwxr-xr-x. 2 root mysql 4096 May 31 20:51 conf -rw-r--r--. 1 root mysql 23698092 Sep 27 2016 datagen.jar -rwxr-xr-x. 1 root mysql 147 Sep 27 2016 datagen.sh -rw-rw-r--. 1 root mysql 31599 May 31 20:54 envbuilder.log -rw-r--r--. 1 root mysql 1741 May 31 20:53 example.schema -rw-r--r--. 1 root mysql 1336 May 31 09:42 example.schema_backup -rw-r--r--. 1 root mysql 2062 Sep 27 2016 readme
方法很簡單的2步,把你想要的表結構和想要生成多少條數據,寫入到example.schema文件,比如這樣,如果想要生成100萬條數據,在表末尾加入注釋/*{RC{1000000}}*/
CREATE TABLE `test`.`tbl_test` ( `post_id` BIGINT(20) DEFAULT '0' , `star` INTEGER(10) DEFAULT '0' , `view_count` INTEGER(11) DEFAULT '0' , `bean` INTEGER(11) DEFAULT '0' , `nearby` INTEGER(11) DEFAULT '0' , PRIMARY KEY (post_id) , INDEX (poster_uid) ) COLLATE='utf8mb4_general_ci' ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 /*{RC{1000000}}*/;
第2步,填寫連接測試數據庫的賬號密碼,只需要加入一行
<property name="obURL" value="jdbc:mysql://數據IP:數據庫端口/數據庫名字?user=用戶名&password=密碼"/>
vi conf/datagen.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans classpath:org/springframework/beans/factory/xml/spring-beans-2.5.xsd"> <bean id="datagen" class="com.alipay.obmeter.tools.DataGen"> <property name="obURL" value="jdbc:mysql://數據IP:數據庫端口/數據庫名字?user=用戶名&password=密碼"/> <property name="inputDDL" value="example.schema"/> <property name="rowCountPerTable" value="1000000"/> <property name="maxThreadCountPerTable" value="20"/> <property name="maxThreadCount" value="20"/> <property name="dropTableFirst" value="true"/> <property name="needFreeze" value="false"/> <property name="staticRatio" value="1.0"/> </bean> </beans>
接著運行shell腳本,往測試庫建表,插入數據
[root@localhost datagen]# /bin/bash datagen.sh
[2017-05-31 08:53:15][WARN ] [DataGen :184] - Parsing ddl... [2017-05-31 08:53:15][WARN ] [DataGen :187] - Creating table... [2017-05-31 08:53:15][WARN ] [MultiThreadPrepareDataComparator:508] - Preparing generators... [2017-05-31 08:53:15][WARN ] [MultiThreadPrepareDataComparator:510] - Generating dynamic data... [2017-05-31 08:54:34][WARN ] [MultiThreadPrepareDataComparator:526] - Generate done.
在測試庫,就會出現100萬條數據了
mysql> select count(*) from test.tbl_test; +----------+ | count(*) | +----------+ | 1000000 | +----------+ 1 row in set (0.16 sec)
現在就可以加索引,explain線上真實的SQL語句了
mysql> explain select post_id from test.tbl_test where post_type <> 1 and check_status = 9 and flag = 1 and post_time < 1496178301 order by post_time asc limit 200; \G +----+-------------+----------+-------+---------------+-----------+---------+------+--------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+----------+-------+---------------+-----------+---------+------+--------+-------------+ | 1 | SIMPLE | tbl_test | range | post_time | post_time | 9 | NULL | 501491 | Using where | +----+-------------+----------+-------+---------------+-----------+---------+------+--------+-------------+ 1 row in set (0.00 sec) ERROR: No query specified
加索引
mysql> alter table test.tbl_test add index idx_f(check_status,flag,post_type,post_time); Query OK, 0 rows affected (4.45 sec) Records: 0 Duplicates: 0 Warnings: 0
再來一次explain,掃描50萬行變2行
mysql> explain select post_id from test.tbl_test where post_type <> 1 and check_status = 9 and flag = 1 and post_time < 1496178301 order by post_time asc limit 200; \G +----+-------------+----------+-------+-----------------+-------+---------+------+------+------------------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+----------+-------+-----------------+-------+---------+------+------+------------------------------------------+ | 1 | SIMPLE | tbl_test | range | post_time,idx_f | idx_f | 15 | NULL | 2 | Using where; Using index; Using filesort | +----+-------------+----------+-------+-----------------+-------+---------+------+------+------------------------------------------+ 1 row in set (0.00 sec)
等調試好索引以后,確定能優化SQL以后,再往線上環境去加索引
當然還有一些很強大的功能
比如某個字段,只出現規定的幾個值,比如狀態status字段0,1,2,以及每個狀態出現的概率
比如模擬線上的用戶UID,可以限制某個字段隨機數的范圍,從00000001到899999999之間等
以上是“SQL調優怎么生成海量測試數據”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。