MySQL——索引的使用對查詢、插入速度的影響
阿新 • • 發佈:2019-01-02
一.什麼是索引?
1.索引:索引是對資料庫中一列或者多列的值進行排序的一種資料結構。
2.索引的作用:索引的作用是為了提高查詢的速度。
3.幾個特點:
- ①MySQL中,主鍵和唯一約束自帶索引;
- ②在查詢時,只有使用到有索引的列,才能提高查詢速度;
- ③索引會降低插入速度,資料量越大,插入速度越慢。
4.索引的演算法:Hash和Btree
- Hash索引:適合等值查詢,在範圍查詢時有可能發生Hash衝突;
- Btree索引:適合範圍查詢,沒有Hash衝突問題。
二.驗證索引對查詢、插入速度的影響
實驗工具:
- Nacivat for MySQL
- eclipse
實驗步驟:
(一)實驗環境建立:
1.使用 Nacivat for MySQL 建立表格 tb_Test;
其中,id為檢測列,即用於插入索引的列。
2.利用eclipse連線MySQL操作表格 tb_Test ;
①eclipse程式碼:
package forJDBC;
import static org.junit.Assert.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class Boker {
private Connection conn;
@Before
public void setUp() throws Exception {
conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/for1703", "root", "root");
}
@After
public void tearDown () throws Exception {
conn.close();
}
@Test
public void testInsert() throws SQLException {
this.insertS();
}
private void insertS() {
try {
Statement stat=conn.createStatement();
StringBuilder sb=new StringBuilder();
for(int i=0;i<500;i++) {
sb.append("('idxxx"+i+"',"+(i+1)+")");
if(i!=499) {
sb.append(",");
}
}
String sql="insert into tb_Test (id,idNumber) values"+sb.toString();
int num=stat.executeUpdate(sql);
System.out.println(num);
} catch (SQLException e) {
e.printStackTrace();
}
}
@Test
public void testSearch() throws SQLException {
this.searchS();
}
private void searchS() throws SQLException {
Statement stat=conn.createStatement();
String sql="select * from tb_Test where id='idxxx255'";
ResultSet rs=stat.executeQuery(sql);
while(rs.next()) {
System.out.println(rs.getString("id")+"\t"+rs.getInt("idNumber")+"\t");
}
}
@Test
public void testDelete(){
this.deleteS();
}
private void deleteS() {
try {
Statement stat =conn.createStatement();
String sql="delete from tb_Test";
System.out.println(stat.executeUpdate(sql));
} catch (SQLException e) {
e.printStackTrace();
}
}
}
②執行 testInsert( ) 向表中插入500條資料,其中id=“idxxx”+(idNumber-1):
(二)驗證過程:
1.當 id 列未新增索引時,執行 testSearch( ) 方法,查詢“idxxx255”,耗費2.880s;
2.應用Navicat for MySQL對id列新增索引,再次查詢“idxxx255”,耗時1.036s;
※發現:查詢相同內容,有索引時可以大大縮短查詢時間。
3.執行 testDelete( ) 刪除表內記錄,並刪去索引;
4.更改程式碼中i值為10000,再次執行 testInsert( ),向沒有索引的表中插入10000組資料,耗時1.371s;
5.再次執行 testDelete( ) 刪除所有資料後,對 id 列新增索引後,再次插入500組同樣的資料,耗時1.817s;
※發現:插入相同資料,無索引比有索引時速度快一些。
三.結論
經過驗證,索引的使用對查詢和插入速度有以下影響:
- 查詢時,使用帶有索引的列可以明顯提高查詢速度;
- 插入時,如果插入的列有索引,插入速度會減慢。
四.分析討論
經過本次實驗,在以後建立表格時,儘量保證將主要的資料都插入之後,再新增索引,避免在新增索引之後進行資料插入,以保證效率最高。
注意:刪除時,要把程式碼前面的插入和查詢程式碼註釋掉,防止刪除失敗。