标签:
因为日常大多是建立在ORM框架下,加上对海量数据的认识并不多,所以索引一直是一个陌生的知识点。话不多说开始总结:
一、什么是索引?
索引是对数据库表中一个或多个列的值进行排序的结构,通常在底层使用B树或B+树来实现。关于B树相关知识,July的博客相当详细:
http://blog.csdn.net/v_JULY_v/article/details/6530142/
二、没有索引的数据库世界是什么样的?
假设我们有一张表,里面有10万条数据。如果没有索引,当查找一条数据时就要扫描全表,如果要查找的记录在表的最后一条,那么在没有任何优化下需要进行10^5次I/O。如果使用索引则可以降到log(10^6)级别,效果是显著的。
三、索引的代价?
1、建立索引将带来额外的开销,这个开销和所建立的索引复杂度有关。
2、当数据库进行更新、删除操作等时,也需要对索引进行同步维护,这也是额外的开销。
3、不恰当的索引并无法对性能带来显著改善。
四、为什么不用数据文件直接排序建立索引而独立出来?
1、单个索引可以这么做,但多个索引无法排序(例如学生信息,既根据学号又要根据姓名来排序是不可能的)
2、索引行一般比数据行要短,当数据更新时候调整索引行的开销比纯数据行更少
3、综上所述,需要索引文件来保存索引
五、MySQL中索引分类
1、普通索引(INDEX)
这是最基本的索引,没有任何限制。
2、唯一索引(UNIQUE INDEX)
索引列的值必须唯一,但允许有空值。
3、主键索引(PRIMARY KEY)
是一种特殊的索引,不允许有空值,一般是在建表时同时创建索引。
4、组合索引
5、全文索引
6、外键索引(只有innodb存储引擎才支持)
六、几个索引原则:
1、选择用来搜索的作为索引列。例如经常根据身份证号来查询用户,那么应该利用身份证号作为索引。
2、使用唯一性索引。对于唯一索引的列,索引的效果最好,而具有多个重复值的列,其索引效果最差。
3、使用短索引。
4、利用最左前缀。
5、不要过度索引。
6、不要在列上进行运算,这将导致索引失效而进行全表扫描
7、少用like语句操作。例如:like “%aaa%”不会索引,而like"aaa%"可以使用索引
七、Mysql中可以用EXPLAIN来查看语句执行过程,利于分析和优化
【参考资料】
标签:
原文地址:http://blog.csdn.net/boy306/article/details/44984147