JAVA後臺開發學習(5)

ahiru?發表於2019-01-23

前幾天遇到一個問題:就是mysql有一個表非常大,導致開啟不了,前端頁面無法顯示錶的相關資訊。一開始這個介面不是我寫的,我看了一下,以前的sql語句是這樣子寫的

ResultSet rs = stmt.executeQuery("select * from " + tableName);
ResultSetMetaData data = rs.getMetaData();
ResultSet primaryKeys = connection.getMetaData().getPrimaryKeys(dataSource.getSchema(), null, tableName);複製程式碼

得到每一個欄位的相關資訊,然後把每一個欄位的資訊set到column裡:

for (int i = 1; i <= data.getColumnCount(); i++) {
    Column column = new Column();
    column.setColumnName(data.getColumnLabel(i));
    column.setColumnType(data.getColumnTypeName(i));
    if(primaryKeysList.contains(data.getColumnLabel(i))){
        column.setPrimaryKey(true);
    }

    columns.add(column);
    column.setSequence(i);
}複製程式碼

這種方法,如果表是很小的話,查詢花的時間確實不長。。但是遇到有幾千條資料開始,就慢到極點。。。經受不起大考驗。


為了找出開啟錶慢的原因,我在這個方法打斷點,發現是卡在執行sql語句的時候,然後我們大佬給我們發了一個sql語句,說這樣執行會很快

select column_name from information_schema.columns where table_name='xxx';
複製程式碼

這個語句能查到每個欄位的名字,還有一些相關資訊還沒查到,我就把改成column_name改成*看能查到欄位什麼相關資訊。

JAVA後臺開發學習(5)

關於欄位的各種資訊都有了。。

最後把程式碼改成:

ResultSet rs = stmt.executeQuery("select column_name , data_type , column_key from information_schema.columns where table_name='" + tableName + "'");
int i=0;
while (rs.next()) {
    Column column = new Column();
    column.setColumnName(rs.getString(1));
    column.setColumnType(rs.getString(2));
    if (rs.getString(3).equalsIgnoreCase("pri"))
        column.setPrimaryKey(true);
    columns.add(column);
    column.setSequence(++i);
}複製程式碼

用postman試了一下  速度確實是大大提高了呀,而且不需要把整張表都查出來!


相關文章