亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MySQL中一些優(yōu)化straight_join技巧

 更新時(shí)間:2015年05月07日 17:10:17   作者:羅龍九  
這篇文章主要介紹了MySQL中一些優(yōu)化straight_join技巧,作者通過用戶的實(shí)際案例分析,需要的朋友可以參考下

在oracle中可以指定的表連接的hint有很多:ordered hint 指示oracle按照from關(guān)鍵字后的表順序來進(jìn)行連接;leading hint 指示查詢優(yōu)化器使用指定的表作為連接的首表,即驅(qū)動(dòng)表;use_nl hint指示查詢優(yōu)化器使用nested loops方式連接指定表和其他行源,并且將強(qiáng)制指定表作為inner表。
在mysql中就有之對應(yīng)的straight_join,由于mysql只支持nested loops的連接方式,所以這里的straight_join類似oracle中的use_nl hint。mysql優(yōu)化器在處理多表的關(guān)聯(lián)的時(shí)候,很有可能會(huì)選擇錯(cuò)誤的驅(qū)動(dòng)表進(jìn)行關(guān)聯(lián),導(dǎo)致了關(guān)聯(lián)次數(shù)的增加,從而使得sql語句執(zhí)行變得非常的緩慢,這個(gè)時(shí)候需要有經(jīng)驗(yàn)的DBA進(jìn)行判斷,選擇正確的驅(qū)動(dòng)表,這個(gè)時(shí)候straight_join就起了作用了,下面我們來看一看使用straight_join進(jìn)行優(yōu)化的案例:

1.用戶實(shí)例:spxxxxxx的一條sql執(zhí)行非常的緩慢,sql如下:

73871 | root      | 127.0.0.1:49665   | user_app_test  | Query    |   500 | Sorting result      |
SELECT DATE(practicetime) date_time,COUNT(DISTINCT a.userid) people_rows
FROM test_log a,USER b
WHERE a.userid=b.userid AND b.isfree=0 AND LENGTH(b.username)>4
GROUP BY DATE(practicetime)

2.查看執(zhí)行計(jì)劃:

mysql> explain SELECT DATE(practicetime) date_time,COUNT(DISTINCT a.userid) people_rows
FROM test_log a,USER b
WHERE a.userid=b.userid AND b.isfree=0 AND LENGTH(b.username)>4
GROUP BY DATE(practicetime);
mysql> explain SELECT DATE(practicetime) date_time,COUNT(DISTINCT a.userid) people_rows
-> FROM test_log a,USER b
-> WHERE a.userid=b.userid AND b.isfree=0 AND LENGTH(b.username)>4
-> GROUP BY DATE(practicetime)\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: a
type: ALL
possible_keys: ix_test_log_userid
key: NULL
key_len: NULL
ref: NULL
rows: 416782
Extra: Using filesort
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: b
type: eq_ref
possible_keys: PRIMARY
key: PRIMARY
key_len: 96
ref: user_app_testnew.a.userid
rows: 1
Extra: Using where
2 rows in set (0.00 sec)

3.查看索引:

mysql> show index from test_log;
+————–+————+————————-+————–+————-+———–+————-+———-++
| Table    | Non_unique | Key_name        | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+————–+————+————————-+————–+————-+———–+————-+———-++
| test_log |     0 | ix_test_log_unique_ |      1 | unitid   | A     |     20 |   NULL | NULL  |   | BTREE   |     |
| test_log |     0 | ix_test_log_unique_ |      2 | paperid   | A     |     20 |   NULL | NULL  |   | BTREE   |     |
| test_log |     0 | ix_test_log_unique_ |      3 | qtid    | A     |     20 |   NULL | NULL  |   | BTREE   |     |
| test_log |     0 | ix_test_log_unique_ |      4 | userid   | A     |   400670 |   NULL | NULL  |   | BTREE   |     |
| test_log |     0 | ix_test_log_unique_ |      5 | serial   | A     |   400670 |   NULL | NULL  |   | BTREE   |     |
| test_log |     1 | ix_test_log_unit  |      1 | unitid   | A     |     519 |   NULL | NULL  |   | BTREE   |     |
| test_log |     1 | ix_test_log_unit  |      2 | paperid   | A     |    2023 |   NULL | NULL  |   | BTREE   |     |
| test_log |     1 | ix_test_log_unit  |      3 | qtid    | A     |    16694 |   NULL | NULL  |   | BTREE   |     |
| test_log |     1 | ix_test_log_serial |      1 | serial   | A     |   133556 |   NULL | NULL  |   | BTREE   |     |
| test_log |     1 | ix_test_log_userid |      1 | userid   | A     |    5892 |   NULL | NULL  |   | BTREE   |     |
+————–+————+————————-+————–+————-+———–+————-+———-+——–+——+——-+

4.調(diào)整索引,A表優(yōu)化采用覆蓋索引:

mysql>alter table test_log drop index ix_test_log_userid,add index ix_test_log_userid(userid,practicetime)

5.查看執(zhí)行計(jì)劃:

mysql> explain SELECT DATE(practicetime) date_time,COUNT(DISTINCT a.userid) people_rows
FROM test_log a,USER b
WHERE a.userid=b.userid AND b.isfree=0 AND LENGTH(b.username)>4
GROUP BY DATE(practicetime)\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: a
type: index
possible_keys: ix_test_log_userid
key: ix_test_log_userid
key_len: 105
ref: NULL
rows: 388451
Extra: Using index; Using filesort
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: b
type: eq_ref
possible_keys: PRIMARY
key: PRIMARY
key_len: 96
ref: user_app_test.a.userid
rows: 1
Extra: Using where
2 rows in set (0.00 sec)

調(diào)整后執(zhí)行稍有效果,但是還不明顯,還沒有找到要害:

SELECT DATE(practicetime) date_time,COUNT(DISTINCT a.userid) people_rows
FROM test_log a,USER b
WHERE a.userid=b.userid AND b.isfree=0 AND LENGTH(b.username)>4
GROUP BY DATE(practicetime);
……………….
143 rows in set (1 min 12.62 sec)

6.執(zhí)行時(shí)間仍然需要很長,時(shí)間的消耗主要耗費(fèi)在Using filesort中,參與排序的數(shù)據(jù)量有38W之多,所以需要轉(zhuǎn)換驅(qū)動(dòng)表;嘗試采用user表做驅(qū)動(dòng)表:使用straight_join強(qiáng)制連接順序:

mysql> explain SELECT DATE(practicetime) date_time,COUNT(DISTINCT a.userid) people_rows
FROM USER b straight_join test_log a
WHERE a.userid=b.userid AND b.isfree=0 AND LENGTH(b.username)>4
GROUP BY DATE(practicetime)\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: b
type: ALL
possible_keys: PRIMARY
key: NULL
key_len: NULL
ref: NULL
rows: 42806
Extra: Using where; Using temporary; Using filesort
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: a
type: ref
possible_keys: ix_test_log_userid
key: ix_test_log_userid
key_len: 96
ref: user_app_test.b.userid
rows: 38
Extra: Using index
2 rows in set (0.00 sec)

執(zhí)行時(shí)間已經(jīng)有了質(zhì)的變化,降低到了2.56秒;

mysql>SELECT DATE(practicetime) date_time,COUNT(DISTINCT a.userid) people_rows
FROM USER b straight_join test_log a
WHERE a.userid=b.userid AND b.isfree=0 AND LENGTH(b.username)>4
GROUP BY DATE(practicetime);
……..
143 rows in set (2.56 sec)

7.在分析執(zhí)行計(jì)劃的第一步:Using where; Using temporary; Using filesort,user表其實(shí)也可以采用覆蓋索引來避免using where的出現(xiàn),所以繼續(xù)調(diào)整索引:

mysql> show index from user;
+——-+————+——————+————–+————-+———–+————-+———-+——–+——+————+———+
| Table | Non_unique | Key_name     | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+——-+————+——————+————–+————-+———–+————-+———-+——–+——+————+———+
| user |     0 | PRIMARY     |      1 | userid   | A     |    43412 |   NULL | NULL  |   | BTREE   |     |
| user |     0 | ix_user_email  |      1 | email    | A     |    43412 |   NULL | NULL  |   | BTREE   |     |
| user |     1 | ix_user_username |      1 | username  | A     |     202 |   NULL | NULL  |   | BTREE   |     |
+——-+————+——————+————–+————-+———–+————-+———-+——–+——+————+———+
3 rows in set (0.01 sec)

mysql>alter table user drop index ix_user_username,add index ix_user_username(username,isfree);
Query OK, 42722 rows affected (0.73 sec)
Records: 42722 Duplicates: 0 Warnings: 0

mysql>explain SELECT DATE(practicetime) date_time,COUNT(DISTINCT a.userid) people_rows
FROM USER b straight_join test_log a
WHERE a.userid=b.userid AND b.isfree=0 AND LENGTH(b.username)>4
GROUP BY DATE(practicetime);
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: b
type: index
possible_keys: PRIMARY
key: ix_user_username
key_len: 125
ref: NULL
rows: 42466
Extra: Using where; Using index; Using temporary; Using filesort
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: a
type: ref
possible_keys: ix_test_log_userid
key: ix_test_log_userid
key_len: 96
ref: user_app_test.b.userid
rows: 38
Extra: Using index
2 rows in set (0.00 sec)

8.執(zhí)行時(shí)間降低到了1.43秒:

mysql>SELECT DATE(practicetime) date_time,COUNT(DISTINCT a.userid) people_rows
FROM USER b straight_join test_log a
WHERE a.userid=b.userid AND b.isfree=0 AND LENGTH(b.username)>4
GROUP BY DATE(practicetime);
。。。。。。。
143 rows in set (1.43 sec)

相關(guān)文章

  • MySQL安裝過程中在第四步initializing database出錯(cuò)的解決方法

    MySQL安裝過程中在第四步initializing database出錯(cuò)的解決方法

    安裝mysql時(shí),在第四步一直卡住了顯示失敗,文中通過圖文介紹的解決方法非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能幫助到大家
    2023-09-09
  • Linux虛擬機(jī)下mysql 5.7安裝配置方法圖文教程

    Linux虛擬機(jī)下mysql 5.7安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了Linux虛擬機(jī)下mysql 5.7安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • 解決mysql模糊查詢索引失效問題的幾種方法

    解決mysql模糊查詢索引失效問題的幾種方法

    我們在使用like %通配符時(shí)常常會(huì)引起索引失效的問題。本文主要介紹了常見的幾種方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2021-06-06
  • Mysql獲取指定時(shí)間范圍數(shù)據(jù)的各種實(shí)例

    Mysql獲取指定時(shí)間范圍數(shù)據(jù)的各種實(shí)例

    最近在做管理后臺(tái)報(bào)表時(shí),給定一個(gè)日期范圍,查出庫中這個(gè)日期范圍內(nèi)的每一天數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于Mysql獲取指定時(shí)間范圍數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • 安裝的mysql中沒有my.ini文件的解決方法

    安裝的mysql中沒有my.ini文件的解決方法

    本文主要介紹了安裝的mysql中沒有my.ini文件的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • mysql啟動(dòng)時(shí)報(bào)錯(cuò):error while loading shared libraries: libncurses.so.5: cannot open shared object file的解決辦法

    mysql啟動(dòng)時(shí)報(bào)錯(cuò):error while loading shared li

    這篇文章主要給大家介紹了解決mysql啟動(dòng)時(shí)報(bào)錯(cuò):error while loading shared libraries: libncurses.so.5: cannot open shared object file的方法,需要的朋友可以參考下
    2023-08-08
  • MySQL數(shù)字類型自增的坑

    MySQL數(shù)字類型自增的坑

    這篇文章主要介紹了MySQL數(shù)字類型自增的坑,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 深入探究Mysql模糊查詢是否區(qū)分大小寫

    深入探究Mysql模糊查詢是否區(qū)分大小寫

    這篇文章主要給大家介紹了關(guān)于Mysql模糊查詢是否區(qū)分大小寫的相關(guān)資料,文中給出了5種解決方法以及各個(gè)方法的建議,需要的朋友可以參考下
    2021-06-06
  • mysql安裝配置方法圖文教程(CentOS7)

    mysql安裝配置方法圖文教程(CentOS7)

    這篇文章主要為大家詳細(xì)介紹了centos7下mysql安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • MySQL單表ibd文件恢復(fù)方法詳解

    MySQL單表ibd文件恢復(fù)方法詳解

    隨著innodb的普及,innobackup也成為了主流備份方式。物理備份對于新建slave,全庫恢復(fù)的需求都能從容應(yīng)對;但當(dāng)面臨單表數(shù)據(jù)誤刪,或者單表誤drop的情況,如果使用物理全備進(jìn)行恢復(fù)呢
    2012-11-11

最新評(píng)論