mysql資料庫索引的建立以及效能測試

javascript前鋒發表於2014-02-19

##---------mysql學習(四)索引的建立--------###
#今天突然開竅了,所以補充點索引方面的知識。
#建立索引,這裡仍然以資料較少的mytab表為例:
#原資料為:
mysql> set names gbk;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from mytab;
+----+--------+-----+--------+
| id | name   | age | salary |
+----+--------+-----+--------+
|  1 | ?阿瓊      |  23 |   1000 |
|  2 | 秋水蝦     |  24 |    500 |
|  3 | 害人精      |  22 |    100 |
+----+--------+-----+--------+
3 rows in set (0.00 sec)
#alter  table table_name add index index_name (column)==
#create index index_name on table_name(column);
#alter建立索引示例

mysql> alter table mytab add index mytab_name (name);
Query OK, 3 rows affected (0.15 sec)
Records: 3  Duplicates: 0  Warnings: 0

#create建立索引示例:
mysql> create index mytab_id on mytab (id);
Query OK, 3 rows affected (0.16 sec)
Records: 3  Duplicates: 0  Warnings: 0

#檢視索引
mysql> show index from mytab;
+-------+------------+----------+--------------+-------------+-----------+------
-------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardi
nality | Sub_part | Packed | Null | Index_type | Comment |
+-------+------------+----------+--------------+-------------+-----------+------
-------+----------+--------+------+------------+---------+
| mytab |          0 | PRIMARY  |            1 | id          | A         |
     3 |     NULL | NULL   |      | BTREE      |         |
| mytab |          1 | mytab_id |            1 | id          | A         |
     3 |     NULL | NULL   |      | BTREE      |         |
+-------+------------+----------+--------------+-------------+-----------+------
-------+----------+--------+------+------------+---------+
2 rows in set (0.00 sec)

#建立unique索引
mysql> alter table mytab add unique (name);
Query OK, 3 rows affected (0.20 sec)
Records: 3  Duplicates: 0  Warnings: 0

#建立聯合索引:
mysql> create index mytab_id_name on mytab (id,name);
Query OK, 3 rows affected (0.20 sec)
Records: 3  Duplicates: 0  Warnings: 0
mysql> show index from mytab;
+-------+------------+---------------+--------------+-------------+-----------+-
------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name      | Seq_in_index | Column_name | Collation |
Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-------+------------+---------------+--------------+-------------+-----------+-
------------+----------+--------+------+------------+---------+
| mytab |          0 | PRIMARY       |            1 | id          | A         |
          3 |     NULL | NULL   |      | BTREE      |         |
| mytab |          0 | name          |            1 | name        | A         |
          3 |     NULL | NULL   |      | BTREE      |         |
| mytab |          1 | mytab_name    |            1 | name        | A         |
          3 |     NULL | NULL   |      | BTREE      |         |
| mytab |          1 | mytab_id_name |            1 | id          | A         |
          3 |     NULL | NULL   |      | BTREE      |         |
| mytab |          1 | mytab_id_name |            2 | name        | A         |
          3 |     NULL | NULL   |      | BTREE      |         |
+-------+------------+---------------+--------------+-------------+-----------+-
------------+----------+--------+------+------------+---------+
5 rows in set (0.00 sec)

#下面我們嘗試一下刪除索引,刪除用drop
#drop index index_name on table_name==
#alter table table_name drop index index_name;

#drop示例:
mysql> drop index mytab_id on mytab;
Query OK, 3 rows affected (0.17 sec)
Records: 3  Duplicates: 0  Warnings: 0

#alter示例:
mysql> alter table mytab drop index mytab_id_name;
Query OK, 3 rows affected (0.17 sec)
Records: 3  Duplicates: 0  Warnings: 0

#現在發現由於資料數量較小,根本無法判斷索引存在的價值。
#
#這裡我打算向其中新增3000行資料,這裡需要用到Java程式碼:
#
| 3001 | yiha_2997 |  22 |   5997 |
| 3002 | yiha_2998 |  22 |   5998 |
| 3003 | yiha_2999 |  22 |   5999 |
+------+-----------+-----+--------+
3003 rows in set (0.01 sec)
#######################java程式碼段##############################
public static void main(String[] args) {
  Connection conn=DBConnection.getConnection();
  try {
   conn.setAutoCommit(false);
   PreparedStatement state=conn.prepareStatement
    ("insert into mytab(name,age,salary) values (?,?,?)");
   for(int i=0;i<3000;i++){
   state.setString(1,"yiha_"+i );
   state.setInt(2, 22);
   state.setInt(3, 3000+i);
   state.addBatch();
   }
   state.executeBatch();
   conn.commit();
   state.close();
  } catch (SQLException e) {
   e.printStackTrace();
  }
 }
######################資料庫連線connection######################
private static String url="jdbc:mysql://" +
   "localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8";
 private static String driver="com.mysql.jdbc.Driver";
 private static String name="root";
 private static String pwd="root";
 public static Connection getConnection(){
  Connection conn;
  try {
   Class.forName(driver).newInstance();
   conn = DriverManager.getConnection(url, name, pwd);
   return conn;

###################################################################

##現在資料庫中有3003條資料,我們看一下檢索資料時間。
#如檢索:
   id      NAME      age     salary
| 2894 | yiha_2890 |  22 |   5890 |
#id以及name為索引,但是age和salary為非索引

mysql> select * from mytab where id=2894;
+------+-----------+-----+--------+
| id   | name      | age | salary |
+------+-----------+-----+--------+
| 2894 | yiha_2890 |  22 |   5890 |
+------+-----------+-----+--------+
1 row in set (0.00 sec)

mysql> select * from mytab where salary=5890;
+------+-----------+-----+--------+
| id   | name      | age | salary |
+------+-----------+-----+--------+
| 2894 | yiha_2890 |  22 |   5890 |
+------+-----------+-----+--------+
1 row in set (0.00 sec)
#可以看出無差別,也許資料仍舊太少,現在將資料提升到30000;

mysql> select * from mytab where id=30000; #id為索引
+-------+------------+-----+--------+
| id    | name       | age | salary |
+-------+------------+-----+--------+
| 30000 | yiha_29996 |  23 |  32996 |
+-------+------------+-----+--------+
1 row in set (0.00 sec)

mysql> select * from mytab where salary=32996;#salary為非索引
+-------+------------+-----+--------+
| id    | name       | age | salary |
+-------+------------+-----+--------+
| 30000 | yiha_29996 |  23 |  32996 |
+-------+------------+-----+--------+
1 row in set (0.02 sec)
#由於name也是索引,所以這裡試一下用name查詢資料:

mysql> select * from mytab where name='yiha_29996';#name為索引
+-------+------------+-----+--------+
| id    | name       | age | salary |
+-------+------------+-----+--------+
| 30000 | yiha_29996 |  23 |  32996 |
+-------+------------+-----+--------+
1 row in set (0.00 sec)

##雖然在資料多次實驗中能夠看出索引的作用,但是並不是很明顯。以上每一組所耗費時間都是
#個人尋找的出現次數最多的時間。

##個人感覺測試索引效果挺無聊的,索引的作用很多文章都只寫了可以精確查詢,至於索引如何
#運用貌似很少有相關的東西。資料庫中的資料還可以隨意擴大,個人感覺先這樣吧。

相關文章