簡體   English   中英

將MySQL表中的行與Java進行比較的最有效方法是什么?

[英]What is the most efficient way to compare rows in a MySQL table with Java

這是一個很大程度上是概念性的問題所以我沒有任何代碼可以展示。 我會盡力解釋這個問題。 我正在編寫一個程序,該程序應該在隨機組合的大表中找到常見的數字序列。

例如,拿這個數據:

1 5 3 9 6 3 8 8 3 3

6 7 5 5 5 4 9 2 0 1

6 4 4 3 7 8 3 9 5 6 

2 4 2 4 5 5 3 4 7 7 

1 5 6 3 4 9 9 3 3 2

0 2 7 9 4 5 3 9 8 3

這些是1-9的隨機組合。 對於每次發現的3個數字(或更多)序列,我需要將其放入另一個數據庫中。 所以第一行包含“5 3 9”,第6行也包含“5 3 9”。 我會將該序列放在一個單獨的表中,並列出它的次數。

我還在研究實際進行這些比較的算法,但我想我必須從“1 5 3”開始,將其與每個發現的3個數字三重奏進行比較,然后轉到“5 3 9”然后“ 3 9 6“等......

我現在的主要問題是,如果這些數字存儲在數據庫中,我不知道該怎么做。 我的數據庫表有11列。 每個單獨的數字一列,整個10位數序列的一列。 列稱為Sequence,1stNum,2ndNum,3rdNum ... 10thNum。

Visual:我數據庫中第一行上面的數據是這樣的:

|  1 5 3 9 6 3 8 8 3 3  |  1  |  5  |  3  |  9  |  6  |  3  |  8  |  8  |  3  |  3  |

(“|”除列)

如何與Java有效地進行比較? 我多次迭代表中的每一行。 對於要比較的初始序列,並且對於每個序列,我遍歷每一行。 基本上是for循環中的for循環。 這聽起來像需要大量的查詢,並且如果表變得龐大(它將會是),可能需要永遠。

如果我使用查詢迭代數據庫,或者如果我轉儲數據庫並遍歷文件,它的計算效率是否更高?

我盡力解釋這個問題,對我來說這是一個非常令人困惑的過程。 我可以澄清你需要我做的任何事情。 我只需要指導這方面的最佳行動方案。

假設您已檢索到列表中的序列,我會這樣做:

List<String> sequences = Arrays.asList("1539638833","6755549201","6443783956","2424553477","1563499332","0279453983");
Map<String,Integer> count = new HashMap<>();
for (String seq : sequences) {
    int length = seq.length();
    for (int i=0 ; i<length - 2 ; i++) {
        String sub = seq.substring(i,i + 3);
        count.put(sub,count.containsKey(sub) ? count.get(sub) + 1 : 1);
    }
}
System.out.println(count);   

輸出:

{920=1, 783=1, 945=1, 332=1, 963=1, 644=1, 156=1, 983=1, 453=1, 153=1, 388=1, 534=1,
 455=1, 245=1, 539=2, 554=1, 242=1, 555=1, 553=1, 437=1, 883=1, 349=1, 755=1, 675=1,
 638=1, 395=1, 201=1, 956=1, 933=1, 499=1, 634=1, 839=1, 794=1, 027=1, 477=1, 833=1,
 347=1, 492=1, 378=1, 279=1, 993=1, 443=1, 396=1, 398=1, 549=1, 563=1, 424=1}

然后,您可以從Map中將這些值存儲在數據庫中。

您可以在帶有union子句的sql中執行此操作:

select sum(c), sequence 
from
(   
    select
        count(*) as c, concat(col1 ,col2 , col3) as sequence
        from t
        group by col1, col2, col3
    union
    select
        count(*) as c, concat(col2 ,col3 , col4) as sequence
        from t
        group by col2, col3, col4
    union (... and so on enumerating through the column combinations)
) as tt
group by sequence

我認為純java實現會更快,並且內存開銷更少。 但是如果你已經在數據庫中擁有它,它可能足夠快。

暫無
暫無

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

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