Maison >base de données >tutoriel mysql >实例测试Mysql使用索引带来的效率提升_MySQL

实例测试Mysql使用索引带来的效率提升_MySQL

WBOY
WBOYoriginal
2016-06-01 13:36:52960parcourir

bitsCN.com

实例测试Mysql使用索引带来的效率提升

 

创建数据库:

[sql] 

CREATE DATABASE `sql_learn_db`;  

创建一个表:

[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  

 

表的结构:  

[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

            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

            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  

 

再次执行相同的查询:  

 

[sql] 

mysql> select count(*) from persons where lastname='abc';  

+----------+  

| count(*) |  

+----------+  

|        7 |  

+----------+  

1 row in set (0.00 sec)  

 

当然,0.00 sec 不等于0,因为速度太快,单位太大(秒),四舍五入后导致该结果(换成毫秒可能就不为0了)。

而且每次执行的结果也不一定相同。但是通过这个小小的实验可以看出,使用索引的表比不使用索引的表要快一点,不过并不是绝对的。要不要使用索引技术要根据具体问题具体分析。如果某个表的查询次数比较多,那么就应该增加索引。但是索引会相应地使表更新速度下降(因为索引也要同时更新)。

 

bitsCN.com

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn