小心情(可直接跳到分割线后)

今天心情好些了。一些浓的化不开的坏情绪,也渐渐的在晚上解决掉一个复杂的逻辑问题后,渐渐消散了。

今天中午去吃饭的时候,坤哥漫不经心的说:'我这么多年终于悟出了一个道理,人年轻的时候不要那么拼命,都没有时间做其他事情了'

我问什么其他事情,坤哥看了我一眼,又继续漫不经心的说,那么忙,都没有时间谈恋爱了。

我想不那么拼命可以嘛?房价每年都涨,生活的成本与日俱增。如果不努力让自己的价值所赚取的金钱,超过经济增速。那么只能继续成为一个社会底层的loser,继续在青春的美好时光,生活在痛苦之中。

唯有努力而已,努力太不够了,拼命的才够,才能与别人的比拼中,占得一点先机。

那么努力,很痛苦的,生活也很单调。这样的生活,又有那个女孩子喜欢呢?

我想近半年来,我的情商、人际交往能力有所下降就与我将全部身心,放在编程上有关。

我本来想用这些话,去和坤哥去聊聊的,但话终于噎在喉咙间,没有去说。

每个人都有自己要走的路,或孤独或热闹,都是自己选的。

你在选择一条道路的时候,必须去抛弃很多东西。

我愿意得到,所以更能下的狠心失去。


吐槽完毕,正文开始:

什么事索引呢?容易被专业名词忽悠的同学请自觉百度看通俗解释:检寻图书资料的一种工具。将书刊中的内容或项目分类摘录,标明页数,按一定次序排列,附在一书之后,或单独编印成册,以便读者查阅。旧称通检或备检。也称引得。

《MySQL核心技术与最佳实践》这一个章节讲的太棒了,所以今天的内容绝大多数都是提炼总结书中的。

用更简单的方式理解索引:索引就是新华字典前面的按拼音、按部首查字的那部分。

生活中,查一个生僻字,如果不知道读音,也不借助与笔画查找,恐怕很难查得到吧,如果让机器去做这件事,那就是查阅整本字典的所有字,匹配后返回。这就造成了全表扫描,效率很低。

但是我们通过部首去找,然后通过笔画,可能查阅的数据量很小,让机器去做,只扫描相关数据项就好了,速度很快。

因此查询速度的快慢,和数据量的大小没有绝对关系,查询速度取决于取出所需的数据,扫描了多少条表数据。他们的比值越小,效率越高。

几个比较重要的知识点:

1、MySQL在检索表中的数据时,先按照索引“关键字”的值在索引中进行查找,如果能够查找的到,则可以直接定位到起始页,如果没有,则全表扫描。

听着《忘记他》刘惜君的歌,开始总结下面的内容。

2、索引其实就是数据库表中字段值的复制,改字段称为索引的关键字。

3、一张数据表可以建立多个索引。

4、什么是前缀索引:

新华字典中的“部首检字表”的使用方法。首先我们先确认要查找这个字的部首是什么,然后看部首外的字笔画是多少,然后查找相应的字。同样对于数据库表而言,索引中关键字的值可以是索引“关键字的一部分,这种索引成为"前缀索引"。例如我可以给用户表中姓名表建立前缀索引。统计姓名中姓张的人数、姓李的人数。

5、索引可以是字段的组合吗?

对数据库而言,索引可以是字段的组合。数据库表中的某个索引如果有多个关键字构成,此时该索引被称为复合索引。无论索引是一个字段、还是几个字段的组合。这些字段必须来自同一张表,比昂切关键字的值必须是表中相应字段值的copy,。

6、不能跨表建立索引。

7、索引数据需要额外的存储空间吗?

这个问题很扯淡,比如想让牛跑的好,又想让牛不吃草。索引文件肯定占存储空间了。对于数据库表的索引而言,索引关键字经过排序后放在外存中。对于MyISAM数据库表而言,索引存放在外存MYI索引文件中。对于InnoDB存储引擎而言,索引数据存放在外存InnoDB表空间文件中(可能是共享表空间文件,也可能是独享表空间文件)。为了提升数据的检索效率,无论MyISAM表的索引还是,InnoDB的索引,索引的关键字经过升序排序后放在外存中。

8、表中那些字段适合选作表的索引?什么事主索引,什么是聚簇索引?

对于MyISAM表而言,MySQL会自动的将表中所有记录主键值的备份以及每条记录所在的起始页编入索引中。像部首检字表一样生成一张“索引表”存放在外存中,这种索引称为主索引(primary key)。MyISAM表的MYI索引文件,与MYD数据文件位于两个文件。通过MYI索引文件中的“表记录指针”,可以找到MYD数据文件中表记录所在的物理地址。

Innodb表的“主索引”与MyISAM表的主索引不同。InnoDB表的主索引关键字的顺序与InnoDB表记录主键值的顺序一致。这种索引就称为“聚簇索引”,并且每一张表只能拥有一个聚簇索引。

9、索引与数据结构是什么关系?

数据库中的所以关键字在索引文件中存储规则十分复杂。为了有效的提高数据库检索效率。索引通常使用平衡树(btree)或者哈希表等复杂的数据结构进行“编排”。在操作数据库的时候,底层操作在执行这种复杂的运算,但我们是感觉不到的。

10、索引越多越好吗?

如果索引过多,在更新数据(添加、修改、删除)时,除了需要修改表中的数据外,还需要对该表的所有索引进行维护,以维持表字段值和索引关键字值的一致性。反而降低了数据的更新速度。

实践表名,当修改表记录的操作特别频繁时,过多的索引会导致硬盘I/O次数明显增加,反而会明显的降低服务器性能。甚至可能会导致宕机。

11、索引关键字的选取原则。

原则1、表中的某字段离散度越高,该字段越适合作为选作索引的关键字。

数据库用户在创建主键约束的同时,MySQL会自动的创建主索引(primary index)且索引名为primary ;在创建唯一约束的同时,MySQL会自动创建唯一性约束(unique index)默认情况下,索引名为唯一约束性约束的字段名。

原则2、占用存储空间少的字段更适合选作索引的关键字。

原则3、存储空间固定的字段更适合选作索引的关键字。

原则4、 where字句中经常使用的字段应该创建索引,分组字段或者排序字段应该创建索引,两个表的连接字段应该创建索引。

昨晚,迟迟不能入眠。浏览空间的时候,得知朋友要离婚了。她是我大学喜欢的女孩子,当初因为任性等原因,相处了很短一段时间,就分开了。结婚才一年时间,也有了孩子。心突然很心痛,幻想能回到从前。那个星星挂满天空的夜晚,我倔强而任性,她热烈而芬芳。算了,还是不要为这些事伤心了,凡人必有命。我还是好好的码代码吧。

引入索引的目的是为了提高检索的效率,因此索引关键字的选择与select语句息息相关。这句话有两个方面的含义,select语句的设计可以决定索引的设计;索引的设计也同样影响着select的设计。select语句中的where字句、group by 字句,以及order by字句,又可以影响索引的设计。两个表的链接字段应该创建索引,外键约束一经创建,mysql便会自动地创建与外键相对应的索引,这是由于外键字段通常是两个表的连接字段。

原则5、更新频繁的字段不适合创建索引,不会出现在where字句中的字段不应该创建索引。

原则6、最左前缀的原则。

复合索引还有另外一个有点,他通过被称为“最左前缀”(leftmost prefixing)的概念体现出来,假设向一个表的多个字段(例如 firstName ,lastName、address)创建复合索引(索引名:firstname_lastname_address)。当where查询的条件是以下各种字段的组合时,mysql将使用fname_lastname_address索引。其他情况将无法使用          fname_lastname_address索引。

firstname,lastname,address

firstname,;lastname

firstname

原则7、 尽量使用前缀索引。

仅仅在姓名中的姓氏部分创建索引,从而可以节省索引的存储空间,提高检索效率。

与数据库的设计一样,索引的设计同样需要数据库开发人员经验的积累,以及智慧的沉淀,同时需要依据系统各自的特点设计出更好的索引,在“加快检索效率”与“降低更新速度”之间做好平衡。从而大幅提升数据库的整体性能。

索引与约束关系:

mysql中的索引与约束的关系是怎样的。约束分为主键约束、唯一性约束、默认值约束、检查约束、非空约束、以及外键约束。其中主键约束、唯一性约束、外键约束与索引的关系更为紧密。

约束主要用于保证业务逻辑操作数据库时数据库的完整性。

而索引则是将关键字数据以某种数据结构(如btree,及二叉树,哈希等)存储到外存,用于提升数据的检索性能。

约束是逻辑层面的概念,而索引既有逻辑上的概念,更是一种物理存储方式,且事实存在,需要耗费一定的存储空间。

unqiue index   索引名  唯一索引

index   索引名      普通索引

index  complex_index(price,publish_time)复合索引

本文大部分内容,摘录于《MySQL核心技术与最佳实践》,有兴趣的朋友可以买这本书看,写的真是很不错。

Mysql学习笔记(四)聊聊数据库索引的更多相关文章

  1. MySql学习笔记四

    MySql学习笔记四 5.3.数据类型 数值型 整型 小数 定点数 浮点数 字符型 较短的文本:char, varchar 较长的文本:text, blob(较长的二进制数据) 日期型 原则:所选择类 ...

  2. Mysql学习笔记(八)索引

    PS:把昨天的学习内容补上...发一下昨天学的东西....五月三日...继续学习数据库... 学习内容: 索引.... 索引的优点: 1.通过创建唯一索引,可以保证数据库每行数据的唯一性... 2.使 ...

  3. Mysql学习笔记整理之数据库优化

    数据库性能瓶颈的原因 数据库连接数 数据量大 硬件资源限制 数据性能优化方案 sql优化       2.缓存        3.建好索引    4.读写分离        5. 分库分表 慢日志查  ...

  4. MySQL学习笔记四:字符集

    1.字符集就是字符和其编码的集合,查看数据库支持的字符集 show character set 2.查看服务端启动时默认的字符集 mysql> show variables like 'char ...

  5. MySQL学习笔记(四)—存储过程

    一.概述      存储过程是数据库定义的一些SQL语句的集合,然后直接调用这些存储过程和函数来执行已经定义好的SQL语句.存储过程可以避免开发人员重复的编写相同的SQL语句,而且存储过程是在MySq ...

  6. MySQL学习笔记(四):存储引擎的选择

    一:几种常用存储引擎汇总表 二:如何选择 一句话:除非需要InnoDB 不具备的特性,并且没有其他办法替代,否则都应该优先考虑InnoDB:或者,不需要InnoDB的特性,并且其他的引擎更加合适当前情 ...

  7. mysql学习笔记四 —— AB复制

    要点:ab复制 mysql集群架构流程: ABB(主从复制)-->MHA(实现mysql高可用.读写分离.脚本控制vip飘逸)-->haproxy(对slave集群实现分发,负载均衡)-- ...

  8. MySQL学习笔记(4) - 创建数据库

    1.建立一个简单的数据库 CREATE DATABASE t1: 图中如果未打:号,系统会等待直到用户输入结束符才会之行语句. 2.查看当前服务器下数据库列表 SHOW DATABASES; 必须是D ...

  9. MySQL学习笔记——存储引擎的索引特性

  10. MySql学习笔记(四) —— 数据的分组

    前面介绍的聚集函数只是用来计算行数,平均数,最大值,最小值而不用检索所有数据.通过count()函数,我们可以计算生产商1003提供的产品数目,但如果我要查询所有生产商提供的商品数,这就需要进行分组查 ...

随机推荐

  1. centos hadoop搭建准备

    永久修改主机名:hostnamectl set-hostname <hostname> IP地址: BOOTPROTO=static IPADDR=192.168.31.128NETMAS ...

  2. Bootstrap系列 -- 40. 导航条二级菜单

    在导航条中添加二级菜单也非常简单 <div class="navbar navbar-default" role="navigation"> < ...

  3. MVC————添加视图时没有模型可用

    我们有时想创建强类型视图,却发现下拉列表里面没有东西,这时不要慌,这是因为你没有编译造成的,编译一下就好了~

  4. koala不支持中文的解决办法(问题出现在使用中文字体时报错)

    C:\Program Files\Koala\rubygems\gems\sass-3.4.9\lib\sass 这是我的koala的安装路径,在sass文件夹下打开engine.rb(文本文档打开即 ...

  5. DLL编写教程

    本文对通用的DLL技术做了一个总结,并提供了源代码打包下载,下载地址为: http://www.blogjava.net/Files/wxb_nudt/DLL_SRC.rar   DLL的优点 简单的 ...

  6. oracle 10g编程

    一.概述 1.sql语言特点 sql语言采用集合操作方式,对数据的处理是成组进行的,而不是一条一条处理,听过使用集合操作方式,可以家加快数据的处理速度. 执行sql语句时每次只能发送并处理一条语句.如 ...

  7. 屠龙之路_转角遇到服务器大魔王_FourthDay

    Day4:将View打败后,View还送了屠龙团一个信物.于是在今天的旅途中,少年们在遇到View的其他兄弟时,以此信物将他们收于麾下,并借助他们的力量打败了服务器大魔王." Fightin ...

  8. java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 错误

    你的ArrayList 是一个没有值的对象(不是null),也就是里面什么对象也没有存(即:arrayList.size()==0).但是,你有取它下标为0值的操作.所以,数组越界了!!比如array ...

  9. ivy,ivyde插件-eclipse

    官方共享更新磁盘下载 http://www.apache.org/dist/ant/ivyde/updatesite/ http://ant.apache.org/ivy/download.cgi 简 ...

  10. jsrender for array 和for object语法

    for array 循环数组 循环使用案例 定义数组数据 var data = { names: ["Maradona","Pele","Ronald ...