博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据库索引
阅读量:2144 次
发布时间:2019-04-30

本文共 1505 字,大约阅读时间需要 5 分钟。

啊里新人(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资源消耗完,进而导致整个数据库不可服务。
 

转载地址:http://kphgf.baihongyu.com/

你可能感兴趣的文章
计算机英语编程中一些单词
查看>>
JavaScript 经典例子
查看>>
判断数据的JS代码
查看>>
js按键事件说明
查看>>
AJAX 初次体验!推荐刚学看这个满好的!
查看>>
AJAX 设计制作 在公司弄的 非得要做出这个养的 真晕!
查看>>
Linux 查看文件大小
查看>>
Java并发编程:线程池的使用
查看>>
redis单机及其集群的搭建
查看>>
Java多线程学习
查看>>
检查Linux服务器性能
查看>>
Java 8新的时间日期库
查看>>
Chrome开发者工具
查看>>
【LEETCODE】102-Binary Tree Level Order Traversal
查看>>
【LEETCODE】106-Construct Binary Tree from Inorder and Postorder Traversal
查看>>
【LEETCODE】237-Delete Node in a Linked List
查看>>
【LEETCODE】206-Reverse Linked List
查看>>
【LEETCODE】203-Remove Linked List Elements
查看>>
【LEETCODE】234-Palindrome Linked List
查看>>
【LEETCODE】141-Linked List Cycle
查看>>