1. 程式人生 > >MySQL——索引的使用對查詢、插入速度的影響

MySQL——索引的使用對查詢、插入速度的影響

一.什麼是索引?

1.索引:索引是對資料庫中一列或者多列的值進行排序的一種資料結構。

2.索引的作用:索引的作用是為了提高查詢的速度

3.幾個特點

  • ①MySQL中,主鍵唯一約束自帶索引;
  • ②在查詢時,只有使用到有索引的列,才能提高查詢速度;
  • ③索引會降低插入速度,資料量越大,插入速度越慢。

4.索引的演算法HashBtree

  • 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

這裡寫圖片描述

※發現:插入相同資料,無索引有索引速度快一些。

三.結論

經過驗證,索引的使用對查詢和插入速度有以下影響:

  1. 查詢時,使用帶有索引的列可以明顯提高查詢速度;
  2. 插入時,如果插入的列有索引,插入速度會減慢。

四.分析討論

經過本次實驗,在以後建立表格時,儘量保證將主要的資料都插入之後,再新增索引,避免在新增索引之後進行資料插入,以保證效率最高。

注意:刪除時,要把程式碼前面的插入和查詢程式碼註釋掉,防止刪除失敗。