数据库索引

来源:互联网 发布:淘宝开店费用多少 编辑:程序博客网 时间:2024/06/05 16:13
啊里新人(Q1):索引我一般都是只有主键,这玩意儿,是不是越少越好? 
玄惭(A1):在日常的业务开发中,常见使用到索引的地方大概有两类:  
第一类.做业务约束需求,比如需要保证表中每行的单个字段或者某几个组合字段是唯一的,则可以在表中创建唯一索引;  
比如:需要保证test表中插入user_id字段的值不能出现重复,则在设计表的时候,就可以在表中user_id字段上创建一个唯一索引:  
CREATE TABLE `test` (  
  `id` int(11) NOT NULL AUTO_INCREMENT,  
  `user_id` int(11) NOT NULL,  
  `gmt_create` datetime DEFAULT NULL,  
  PRIMARY KEY (`id`),  
  UNIQUE KEY `uk_userid` (`user_id`)  
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;  
 
 
第二类.提高SQL语句执行速度,可以根据SQL语句的查询条件在表中创建合适的索引,以此来提升SQL语句的执行速度;  
此过程好比是去图书找一本书,最慢的方法就是从图书馆的每一层楼每一个书架一本本的找过去;快捷一点的方法就是先通过图书检索来确认这一本书在几楼那个书架上,然后直接去找就可以了;当然创建这个索引也需要有一定的代价,需要存储空间来存放,需要在数据行插入,更新,删除的时候维护索引:  
例如:  
CREATE TABLE `test_record` (  
  `id` int(11) NOT NULL AUTO_INCREMENT,  
  `user_id` int(11) NOT NULL,  
  `gmt_create` datetime DEFAULT NULL,  
  PRIMARY KEY (`id`)  
) ENGINE=InnoDB AUTO_INCREMENT=5635996 DEFAULT CHARSET=utf8  
该表有500w的记录,我需要查询20:00后插入的记录有多少条记录:  
mysql> select count(*) from test_record where gmt_create>'2014-12-17 20:00:00';  
+----------+  
| count(*) |  
+----------+  
|        1 |  
+----------+  
1 row in set (1.31 sec)  
可以看到查询耗费了1.31秒返回了1行记录,如果我们在gmt_create字段上添加索引:  
mysql> alter table test_record add index ind_gmt_create(gmt_create);  
Query OK, 0 rows affected (21.87 sec)  
Records: 0  Duplicates: 0  Warnings: 0  
mysql> select count(*) from test_record where gmt_create>'2014-12-17 20:00:00';  
+----------+  
| count(*) |  
+----------+  
|        1 |  
+----------+  
1 row in set (0.01 sec)  
查询只消耗了0.01秒中就返回了记录.  
总的来说,为SQL语句(select,update,delete)创建必要的索引是必须的,这样虽然有一定的性能和空间消耗,但是是值得,尤其是在大并发的请求下,大量的数据被扫描造成系统IO和CPU资源消耗完,进而导致整个数据库不可服务。 
0 0