前幾天遇到一個問題:就是mysql有一個表很是大,致使打開不了,前端頁面沒法顯示錶的相關信息。一開始這個接口不是我寫的,我看了一下,之前的sql語句是這樣子寫的前端
ResultSet rs = stmt.executeQuery("select * from " + tableName);
ResultSetMetaData data = rs.getMetaData();
ResultSet primaryKeys = connection.getMetaData().getPrimaryKeys(dataSource.getSchema(), null, tableName);複製代碼
獲得每個字段的相關信息,而後把每個字段的信息set到column裏:mysql
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語句的時候,而後咱們大佬給咱們發了一個sql語句,說這樣執行會很快bash
select column_name from information_schema.columns where table_name='xxx';
複製代碼
這個語句能查到每一個字段的名字,還有一些相關信息還沒查到,我就把改爲column_name改爲*看能查到字段什麼相關信息。post
關於字段的各類信息都有了。。ui
最後把代碼改爲:spa
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試了一下 速度確實是大大提升了呀,並且不須要把整張表都查出來!code