程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 實例測試Mysql使用索引帶來的效率提升

實例測試Mysql使用索引帶來的效率提升

編輯:MySQL綜合教程

實例測試Mysql使用索引帶來的效率提升   創建數據庫: [sql]  CREATE DATABASE `sql_learn_db`;     www.2cto.com   創建一個表: [sql]  Create Table: CREATE TABLE `persons` (     `Id` int(11) NOT NULL AUTO_INCREMENT,     `LastName` varchar(255) DEFAULT NULL,     `FirstName` varchar(255) DEFAULT NULL,     `Address` varchar(255) DEFAULT NULL,     `City` varchar(255) DEFAULT NULL,     PRIMARY KEY (`Id`)   ) ENGINE=InnoDB DEFAULT CHARSET=utf8     表的結構: www.2cto.com   [plain]  +-----------+--------------+------+-----+---------+----------------+   | Field     | Type         | Null | Key | Default | Extra          |   +-----------+--------------+------+-----+---------+----------------+   | Id        | int(11)      | NO   | PRI | NULL    | auto_increment |   | LastName  | varchar(255) | YES  |     | NULL    |                |   | FirstName | varchar(255) | YES  |     | NULL    |                |   | Address   | varchar(255) | YES  |     | NULL    |                |   | City      | varchar(255) | YES  |     | NULL    |                |   +-----------+--------------+------+-----+---------+----------------+     利用JDBC插入 1000000條數據。   DBIndexTest.java: (請手動修改用戶名和密碼,並導入驅動包) [java]  import java.sql.Connection;   import java.sql.DriverManager;   import java.sql.PreparedStatement;   import java.sql.SQLException;   import java.util.Random;         public class DBIndexTest {          private static final String MYSQL_DRIVER = "com.mysql.jdbc.Driver";       private static final String DB_URL = "jdbc:mysql://localhost:3306/sql_learn_db";              private static final String USER_NAME = "root";       private static final String PASSWORD = "";              private static final String sql = "insert into persons values (null,?,?,'zjut','hangzhou')";              private static Connection conn = null;              private static PreparedStatement pstmt = null;              private static Random random = new Random();              private DBIndexTest(){};              public static String getRandomName() {           int fornum = 1 + random.nextInt(10);  /* 1~10 */           StringBuilder sb = new StringBuilder();  /* 97~122 */           for(int i=0; i<fornum;i++) {               sb.append((char)(97 + random.nextInt(26)));           }           return sb.toString();       }              private static void createConnection() {           try {               Class.forName(MYSQL_DRIVER);               conn = DriverManager.getConnection(DB_URL,USER_NAME,PASSWORD);           } catch (ClassNotFoundException e) {               // TODO Auto-generated catch block               e.printStackTrace();              } catch (SQLException e) {               // TODO Auto-generated catch block               e.printStackTrace();              }                  }              public static Connection getConnection() {           if(conn == null) {               createConnection();           }           return conn;       }       public static void insertRecord() {           conn = getConnection();           try {               if(pstmt == null)                   pstmt = conn.prepareStatement(sql);                              pstmt.setString(1, getRandomName());               pstmt.setString(2, getRandomName());               int affect = pstmt.executeUpdate();               System.out.println(affect == 1 ? "插入成功!" : "插入失敗!");                          } catch (SQLException e) {               // TODO Auto-generated catch block               e.printStackTrace();           }       }              public static void main(String[] args) {           long start = System.currentTimeMillis();                      for(int i=0; i< 1000000; i++) {               insertRecord();           }           long end = System.currentTimeMillis();                      System.out.println("一共用時:" + (end-start)/1000.0 + "s");                  }      }     運行結果: [plain]  插入成功!   插入成功!   插入成功!   ...   ...   ...   插入成功!   插入成功!   插入成功!   插入成功!   插入成功!   插入成功!   插入成功!   插入成功!   插入成功!   插入成功!   插入成功!   插入成功!   插入成功!   插入成功!   插入成功!   插入成功!   插入成功!   插入成功!   插入成功!   一共用時:2167.19s     表中已插入的記錄數: [sql]  mysql> select count(*) from persons;   +----------+   | count(*) |   +----------+   |  1000000 |   +----------+     在沒有對表的列LastName建立索引時,嘗試查詢:   [sql]  mysql> select count(*) from persons where lastname='abc';   +----------+   | count(*) |   +----------+   |        7 |   +----------+   1 row in set (6.33 sec)     對表列LastName建立索引:   [sql]  mysql> create index my_index on persons(lastname);   Query OK, 0 rows affected (12.44 sec)   Records: 0  Duplicates: 0  Warnings: 0     再次執行相同的查詢: www.2cto.com     [sql]  mysql> select count(*) from persons where lastname='abc';   +----------+   | count(*) |   +----------+   |        7 |   +----------+   1 row in set (0.00 sec)     當然,0.00 sec 不等於0,因為速度太快,單位太大(秒),四捨五入後導致該結果(換成毫秒可能就不為0了)。 而且每次執行的結果也不一定相同。但是通過這個小小的實驗可以看出,使用索引的表比不使用索引的表要快一點,不過並不是絕對的。要不要使用索引技術要根據具體問題具體分析。如果某個表的查詢次數比較多,那麼就應該增加索引。但是索引會相應地使表更新速度下降(因為索引也要同時更新)。  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved