簡體   English   中英

mysql離開連接多表的地方很慢

[英]mysql left join multi tables with where very slow

閱讀其他左加入慢速文章,嘗試了許多方法,但仍然沒有答案。

t_pbl_list是IP子網黑名單。 80萬行。

CREATE TABLE `t_pbl_list` (
    `_mask` tinyint(3) unsigned NOT NULL, #subnet
    `_ipNet` int(10) unsigned NOT NULL,
    `_attr` tinyint(3) unsigned NOT NULL, # bit0: exception
    PRIMARY KEY (`_mask`,`_ipNet`),
    KEY `ix_pbl_list` (`_mask`,`_ipNet`,`_attr`)
) ENGINE=MEMORY DEFAULT CHARSET=latin1

t_pbl_result是IP結果列表370萬行。

CREATE TABLE `t_pbl_result` (
  `_ip` int(10) unsigned NOT NULL,
  `_utSlotAdd` mediumint(8) unsigned NOT NULL,
  PRIMARY KEY (`_ip`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1

我想從t_pbl_result中選擇_ip ,而不是在t_pbl_list

我不知道為什么這個SQL需要50秒的內存。 Myisam運行200秒。

1, SIMPLE, A, index, , PRIMARY, 4, , 3687929, Using index
1, SIMPLE, B32, eq_ref, PRIMARY,ix_pbl_list, PRIMARY, 5, const,func, 1, 
1, SIMPLE, B31, eq_ref, PRIMARY,ix_pbl_list, PRIMARY, 5, const,func, 1, 
1, SIMPLE, B30, eq_ref, PRIMARY,ix_pbl_list, PRIMARY, 5, const,func, 1, 
1, SIMPLE, B29, eq_ref, PRIMARY,ix_pbl_list, PRIMARY, 5, const,func, 1, 
1, SIMPLE, B28, eq_ref, PRIMARY,ix_pbl_list, PRIMARY, 5, const,func, 1, 
1, SIMPLE, B27, eq_ref, PRIMARY,ix_pbl_list, PRIMARY, 5, const,func, 1, 
1, SIMPLE, B26, eq_ref, PRIMARY,ix_pbl_list, PRIMARY, 5, const,func, 1, 
1, SIMPLE, B25, eq_ref, PRIMARY,ix_pbl_list, PRIMARY, 5, const,func, 1, 
1, SIMPLE, B24, eq_ref, PRIMARY,ix_pbl_list, PRIMARY, 5, const,func, 1, 
1, SIMPLE, B23, eq_ref, PRIMARY,ix_pbl_list, PRIMARY, 5, const,func, 1, 
1, SIMPLE, B22, eq_ref, PRIMARY,ix_pbl_list, PRIMARY, 5, const,func, 1, 
1, SIMPLE, B21, eq_ref, PRIMARY,ix_pbl_list, PRIMARY, 5, const,func, 1, 
1, SIMPLE, B20, eq_ref, PRIMARY,ix_pbl_list, PRIMARY, 5, const,func, 1, 
1, SIMPLE, B19, eq_ref, PRIMARY,ix_pbl_list, PRIMARY, 5, const,func, 1, 
1, SIMPLE, B18, eq_ref, PRIMARY,ix_pbl_list, PRIMARY, 5, const,func, 1, 
1, SIMPLE, B17, eq_ref, PRIMARY,ix_pbl_list, PRIMARY, 5, const,func, 1, 
1, SIMPLE, B16, eq_ref, PRIMARY,ix_pbl_list, PRIMARY, 5, const,func, 1, 
1, SIMPLE, B15, eq_ref, PRIMARY,ix_pbl_list, PRIMARY, 5, const,func, 1, 
1, SIMPLE, B14, eq_ref, PRIMARY,ix_pbl_list, PRIMARY, 5, const,func, 1, 
1, SIMPLE, B13, eq_ref, PRIMARY,ix_pbl_list, PRIMARY, 5, const,func, 1, 
1, SIMPLE, B12, eq_ref, PRIMARY,ix_pbl_list, PRIMARY, 5, const,func, 1, 
1, SIMPLE, B11, eq_ref, PRIMARY,ix_pbl_list, PRIMARY, 5, const,func, 1, 
1, SIMPLE, B10, eq_ref, PRIMARY,ix_pbl_list, PRIMARY, 5, const,func, 1, 
1, SIMPLE, B09, eq_ref, PRIMARY,ix_pbl_list, PRIMARY, 5, const,func, 1, 
1, SIMPLE, B08, eq_ref, PRIMARY,ix_pbl_list, PRIMARY, 5, const,func, 1, Using where

SQL:

SELECT 
A._ip
FROM t_pbl_result AS A
LEFT JOIN t_pbl_list AS B32 ON B32._mask = 32 AND B32._ipNet = A._ip >>  0  
LEFT JOIN t_pbl_list AS B31 ON B31._mask = 31 AND B31._ipNet = A._ip >> 01
LEFT JOIN t_pbl_list AS B30 ON B30._mask = 30 AND B30._ipNet = A._ip >> 02
LEFT JOIN t_pbl_list AS B29 ON B29._mask = 29 AND B29._ipNet = A._ip >> 03
LEFT JOIN t_pbl_list AS B28 ON B28._mask = 28 AND B28._ipNet = A._ip >> 04
LEFT JOIN t_pbl_list AS B27 ON B27._mask = 27 AND B27._ipNet = A._ip >> 05
LEFT JOIN t_pbl_list AS B26 ON B26._mask = 26 AND B26._ipNet = A._ip >> 06
LEFT JOIN t_pbl_list AS B25 ON B25._mask = 25 AND B25._ipNet = A._ip >> 07
LEFT JOIN t_pbl_list AS B24 ON B24._mask = 24 AND B24._ipNet = A._ip >> 08
LEFT JOIN t_pbl_list AS B23 ON B23._mask = 23 AND B23._ipNet = A._ip >> 09
LEFT JOIN t_pbl_list AS B22 ON B22._mask = 22 AND B22._ipNet = A._ip >> 10
LEFT JOIN t_pbl_list AS B21 ON B21._mask = 21 AND B21._ipNet = A._ip >> 11
LEFT JOIN t_pbl_list AS B20 ON B20._mask = 20 AND B20._ipNet = A._ip >> 12
LEFT JOIN t_pbl_list AS B19 ON B19._mask = 19 AND B19._ipNet = A._ip >> 13
LEFT JOIN t_pbl_list AS B18 ON B18._mask = 18 AND B18._ipNet = A._ip >> 14
LEFT JOIN t_pbl_list AS B17 ON B17._mask = 17 AND B17._ipNet = A._ip >> 15
LEFT JOIN t_pbl_list AS B16 ON B16._mask = 16 AND B16._ipNet = A._ip >> 16
LEFT JOIN t_pbl_list AS B15 ON B15._mask = 15 AND B15._ipNet = A._ip >> 17
LEFT JOIN t_pbl_list AS B14 ON B14._mask = 14 AND B14._ipNet = A._ip >> 18
LEFT JOIN t_pbl_list AS B13 ON B13._mask = 13 AND B13._ipNet = A._ip >> 19
LEFT JOIN t_pbl_list AS B12 ON B12._mask = 12 AND B12._ipNet = A._ip >> 20
LEFT JOIN t_pbl_list AS B11 ON B11._mask = 11 AND B11._ipNet = A._ip >> 21
LEFT JOIN t_pbl_list AS B10 ON B10._mask = 10 AND B10._ipNet = A._ip >> 22
LEFT JOIN t_pbl_list AS B09 ON B09._mask = 09 AND B09._ipNet = A._ip >> 23
LEFT JOIN t_pbl_list AS B08 ON B08._mask = 08 AND B08._ipNet = A._ip >> 24
WHERE 
(        # not in any subnet.
         B32._mask IS NULL AND B31._mask IS NULL AND B30._mask IS NULL AND B29._mask IS NULL AND B28._mask IS NULL AND B27._mask IS NULL
     AND B26._mask IS NULL AND B25._mask IS NULL AND B24._mask IS NULL AND B23._mask IS NULL AND B22._mask IS NULL AND B21._mask IS NULL
     AND B20._mask IS NULL AND B19._mask IS NULL AND B18._mask IS NULL AND B17._mask IS NULL AND B16._mask IS NULL AND B15._mask IS NULL
     AND B14._mask IS NULL AND B13._mask IS NULL AND B12._mask IS NULL AND B11._mask IS NULL AND B10._mask IS NULL AND B09._mask IS NULL
     AND B08._mask IS NULL 
)
OR
(       # any subnet has exception attr.
        B32._attr & 1 <=> 1 OR B31._attr & 1 <=> 1 OR B30._attr & 1 <=> 1 OR B29._attr & 1 <=> 1 OR B28._attr & 1 <=> 1 OR B27._attr & 1 <=> 1 
     OR B26._attr & 1 <=> 1 OR B25._attr & 1 <=> 1 OR B24._attr & 1 <=> 1 OR B23._attr & 1 <=> 1 OR B22._attr & 1 <=> 1 OR B21._attr & 1 <=> 1 
     OR B20._attr & 1 <=> 1 OR B19._attr & 1 <=> 1 OR B18._attr & 1 <=> 1 OR B17._attr & 1 <=> 1 OR B16._attr & 1 <=> 1 OR B15._attr & 1 <=> 1 
     OR B14._attr & 1 <=> 1 OR B13._attr & 1 <=> 1 OR B12._attr & 1 <=> 1 OR B11._attr & 1 <=> 1 OR B10._attr & 1 <=> 1 OR B09._attr & 1 <=> 1 
     OR B08._attr & 1 <=> 1 
)
;

在沒有條件的情況下嘗試查詢。 只需將_ip合並到另一個表中即可。 也慢。

嘗試在其中加入的地方使用子查詢。 也慢。

嘗試使用的地方不存在,而是加入。 也慢。

嘗試刪除>>操作功能。 也慢。

我認為內部聯接可以快得多,但是我需要將所有表聯接到同一表。

50秒? 嗯,花3.7M * 24 JOINs需要時間。

t_pbl_list中的ip范圍是否重疊? 如果沒有,那么有一項優化可以在一個測試中執行每個測試,而不是24個測試。 仍然有370萬個測試。 http://mysql.rjweb.org/doc.php/ipranges

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM