mysql慢查询优化实例------建立索引

       我们都知道, 很多时候, 要对数据库增加索引, 可以提升查询速度, 有兴趣的可以看看数据库索引原理, 本文来实际测试一下。
       测试数据库记录大概10000条, 先看看没有索引的情况。 

       表结构为:

mysql> show create table tb_test;                            
+---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+  
| Table   | Create Table                                                                                                                                                                                                                                                                                                                 |  
+---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+  
| tb_test | CREATE TABLE `tb_test` (  
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'test',  
  `name` varchar(32) NOT NULL COMMENT 'test',  
  `score` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'test',  
  PRIMARY KEY (`id`)  
) ENGINE=InnoDB AUTO_INCREMENT=10004 DEFAULT CHARSET=utf8 COMMENT='测试表, 无实际作用'          |  
+---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+  
1 row in set (0.00 sec)  
       开启profiling(命令是set profiling=1;),  然后进行两次 select操作, 分析结果如下:

mysql> show profiles;                            
+----------+------------+----------------------------------------------------+  
| Query_ID | Duration   | Query                                              |  
+----------+------------+----------------------------------------------------+  
|    10021 | 0.00306534 | select * from tb_test where name = 'n1'            |  
|    10022 | 0.00298983 | select * from tb_test where score = 1              |  
+----------+------------+----------------------------------------------------+  

      

       将name字段设置为索引, 表结构为:

mysql> show create table tb_test;                            
+---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+  
| Table   | Create Table                                                                                                                                                                                                                                                                                                                                            |  
+---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+  
| tb_test | CREATE TABLE `tb_test` (  
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'test',  
  `name` varchar(32) NOT NULL COMMENT 'test',  
  `score` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'test',  
  PRIMARY KEY (`id`),  
  KEY `idx_name` (`name`)  
) ENGINE=InnoDB AUTO_INCREMENT=10004 DEFAULT CHARSET=utf8 COMMENT='测试表, 无实际作用'          |  
+---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+  
1 row in set (0.00 sec)  
       再次进行两次相同的select操作, 分析结果如下:

mysql> show profiles;                            
+----------+------------+----------------------------------------------------+  
| Query_ID | Duration   | Query                                              |  
+----------+------------+----------------------------------------------------+  
|    10021 | 0.00306534 | select * from tb_test where name = 'n1'            |  
|    10022 | 0.00298983 | select * from tb_test where score = 1              |  
|    10023 | 0.00074623 | select * from tb_test where name = 'n1'            |  
|    10024 | 0.00298101 | select * from tb_test where score = 1              |  
+----------+------------+----------------------------------------------------+  
       可见, Query_ID为10023的那条查询快了很多。



       继续将score字段设置为索引, 表结构为:

mysql> show create table tb_test;  
+---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+  
| Table   | Create Table                                                                                                                                                                                                                                                                                                                                                                         |  
+---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+  
| tb_test | CREATE TABLE `tb_test` (  
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'test',  
  `name` varchar(32) NOT NULL COMMENT 'test',  
  `score` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'test',  
  PRIMARY KEY (`id`),  
  KEY `idx_name` (`name`),  
  KEY `idx_score` (`score`)  
) ENGINE=InnoDB AUTO_INCREMENT=10004 DEFAULT CHARSET=utf8 COMMENT='测试表, 无实际作用'          |  
+---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+  
1 row in set (0.00 sec) 
       进行两次相同的select操作, 分析结果如下:

mysql> show profiles;                            
+----------+------------+----------------------------------------------------+  
| Query_ID | Duration   | Query                                              |  
+----------+------------+----------------------------------------------------+  
|    10021 | 0.00306534 | select * from tb_test where name = 'n1'            |  
|    10022 | 0.00298983 | select * from tb_test where score = 1              |  
|    10023 | 0.00074623 | select * from tb_test where name = 'n1'            |  
|    10024 | 0.00298101 | select * from tb_test where score = 1              |  
|    10027 | 0.00073865 | select * from tb_test where name = 'n1'            |  
|    10028 | 0.00072649 | select * from tb_test where score = 1              |  
+----------+------------+----------------------------------------------------+  
        可见, Query_ID为10027和10028d的那两条快了很多。



        综上所述: 
        1. 索引能提升查询速度。 当然, 索引也有弊端, 不能任意妄为。
        2. 如上记录仅仅是10000条, 如果记录条数为100万, 那么索引的效果就更能很好体现了。




  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值