热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

Mysql学习笔记(四)聊聊数据库索引

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

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

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

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

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

我想不那么拼命可以嘛?房价每年都涨,生活的成本与日俱增。如果不努力让自己的价值所赚取的金钱,超过经济增速。那么只能继续成为一个社会底层的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核心技术与最佳实践》,有兴趣的朋友可以买这本书看,写的真是很不错。

     


推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Python实现变声器功能(萝莉音御姐音)的方法及步骤
    本文介绍了使用Python实现变声器功能(萝莉音御姐音)的方法及步骤。首先登录百度AL开发平台,选择语音合成,创建应用并填写应用信息,获取Appid、API Key和Secret Key。然后安装pythonsdk,可以通过pip install baidu-aip或python setup.py install进行安装。最后,书写代码实现变声器功能,使用AipSpeech库进行语音合成,可以设置音量等参数。 ... [详细]
  • 本文介绍了关于apache、phpmyadmin、mysql、php、emacs、path等知识点,以及如何搭建php环境。文章提供了详细的安装步骤和所需软件列表,希望能帮助读者解决与LAMP相关的技术问题。 ... [详细]
  • 本文介绍了通过mysql命令查看mysql的安装路径的方法,提供了相应的sql语句,并希望对读者有参考价值。 ... [详细]
  • 本文详细介绍了MySQL表分区的创建、增加和删除方法,包括查看分区数据量和全库数据量的方法。欢迎大家阅读并给予点评。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
author-avatar
手机用户2502883723
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有