-
2017-03-13 18:59:08
附录B 如何阅读本书
本书是一本数据库内核相关书籍,从数据库的查询优化器入手,对数据库的查询优化引擎进行了分析和对比,对查询优化的技术做了全面的总结和剖析。从不同角度看,可能有着不同的感受;不同角色的人,可能对本书有着不同的需求。阅读本书,如果能和实践结合,效果甚佳。
B.1 数据库引擎开发人员
如果您是一名数据库内核的开发者,也许您对于PostgreSQL和MySQL的查询优化器的代码结构、实现过程更为感兴趣。
本书的第二篇、第三篇,主要从PostgreSQL和MySQL的代码入手,依据实现流程,进行分析,既有主干过程的描述,也有重要细节的剖析,更有重要话题的全流程总结、对比。
从目录结构出发,您可以一览PostgreSQL和MySQL查询优化器的全貌,抓住主干。
从每一个函数的解析中,您可以掌握PostgreSQL和MySQL查询优化器的实现细节,对查询优化器了然于胸。
从第二、三篇和代码对比,您可以对比2个查询优化器实现的异同,品味他们相似而又不同的味道。从一座山中看另外一座山,从两山之外再看山,其中的滋味,非“只缘身在此山中”所能比拟。
B.2数据库管理员
如果您是一名数据库管理员,也许您对于PostgreSQL和MySQL的查询优化器所能支持的优化功能更感兴趣。
本书的第一篇给出了查询优化技术的全貌,有助于您对查询优化技术建立全面的概念并能深入理解;第四篇,主要从PostgreSQL和MySQL支持的优化功能入手,进行了总结对比,有助于您对这两个数据库的查询优化功能全面而准确的掌握,知其所能,也知其所不能。这样在工作实践中,可更好地应用。
全书既有理论、又有代码分析,还有对比总结、示例实践,从多个角度帮助数据库管理员掌握数据库的SQL查询优化原理,从而能在实践中有效指导SQL的优化工作。
此后,SQL优化工作,您不再需要发愁,本书会为您加油,为您助力。
B.3数据库爱好者和学生
数据库技术的爱好者和学生,是数据库技术发展的重要源泉。因为热爱,您能专研;因为学习,您能深入。
全书共四篇,第一篇是理论、第二篇是PostgreSQL的查询优化器实现、第三篇是MySQL的查询优化器实现、第四篇是理论和PostgreSQL和MySQL查询优化技术的对比,全面学习这四部分内容,全面掌握这四部分内容,相信您能对数据库查询优化器和查询优化技术将有着全面而深刻地掌握。
从第一篇入手,学习查询优化的理论和技术,先对查询优化建立全面的印象和概念。
阅读第二篇内容,结合PostgreSQL的代码,互为印证。把本书所附示例逐个执行,结合原理、代码、示例执行结果,体悟PostgreSQL查询优化器的实现、SQL优化的结果。
阅读第三篇内容,结合MySQL的代码,互为印证……
结合第二篇、第三篇内容,反复把原理、代码、示例融合……想必您内外皆修必将形神具备。
请不要放弃,遇到困难,坚持必有所成。
更多相关内容 -
Oracle数据库查询优化的方法
2018-09-25 21:45:47Oracle数据库查询优化方法知识的介绍,了解常用优化的方法和技巧 -
数据库查询优化器艺术
2018-11-21 20:21:34数据库查询优化器的艺术,深入剖析数据库查询器实现源码及原理。 -
数据库查询优化
2019-05-07 15:42:24数据库查询优化器的艺术,原理解析与SQL性能优化 -
Android SQLite数据库进行查询优化的方法
2021-01-05 11:24:40要进行查询优化,这里就会用到索引,C端的数据量大部分情况下面虽然不是很大,但良好的索引建立习惯往往会带来不错的查询性能提升,同时在未知的将来经得住更大数据的考验,那如何优化数据库查询呢,下面我们用例子... -
论文研究-基于粒子群算法的数据库查询优化.pdf
2019-07-22 18:25:56研究粒子群算法在数据库查询优化中的应用问题。为了解决大型数据库信息检索困难、查询效率低的问题,提出了一种基于粒子群算法优化数据库查询技术方案。算法提出了一种数据库查询执行计划代价模型,主要包括了查询多... -
基于SQL标准的关系数据库查询优化技术研究
2020-07-04 07:37:54从索引优化以及SQL语句优化2方面分析了关系数据库查询优化技术。使用合理有效的索引可以提高查询效率,创建索引应与查询需求紧密结合。对SQL查询语句从执行过程角度进行规划设计,可以有效减少查询中间过程的计算量,... -
基于Oracle9i数据库的查询优化_mysql数据库查询优化
2020-08-14 00:51:46基于 Oracle9i 数据库的查询优化 摘要:Oracle9i 数据库的任务是存储和管理数据而我们用户能看到的有关数据库特性就是 它的性能数据库的查询操作是影响一个应用系统响应时间的关键因素科学合理地构造 查询系统是成功... -
分布式数据库查询优化算法综述
2012-06-07 18:19:57分布式数据库查询优化算法综述,介绍了分布式数据库查询优化的基本思想 -
MySQL数据库查询优化技术
2018-03-19 13:36:01MySQL数据库查询优化技术 (完结) MySQL的查询优化技术-01-15 -
数据库查询优化技术(一):数据库与关系代数
2018-11-23 11:15:09数据库查询优化技术 学习笔记(一) 我是看李海翔的《数据库技术丛书·数据库查询优化器的艺术:原理解析与SQL性能优化》这本书的视频讲解学习的,因为数据库的知识学的不多,直接看优化有些吃力,慢慢补吧。...数据库查询优化技术 学习笔记(一)
我是看李海翔的《数据库技术丛书·数据库查询优化器的艺术:原理解析与SQL性能优化》这本书的视频讲解学习的,因为数据库的知识学的不多,直接看优化有些吃力,慢慢补吧。现在要用一些优化的知识只能先看着了。
本文大概内容:
1.1 What is the Database Management System ?
1.2 What is the Relation Database Management System?
1.3 Why do we need to learn MySQL/PostgreSQL ?
2 What is the relational algebra ?
3 What is the technology Of Query Optimization ?
4 How to learn and master it ?
5.3Query Optimization Algorithm
5.4Parallel query optimization
5.5Distributrd Query Optimization
(。。英文是为了强行记忆这些单词。。)
1.1 What is the Database Management System ?
数据库管理系统(Database Management System):
1是一种操纵和管理数据的大型软件,用于建立、使用和维护数据,简称DBMS。
2它对数据进行统一的管理和控制,以保证数据的安全性和完整性。
3用户通过DBMS访问数据库中的数据,数据库管理员也通过DBMS进行数据库的维护工作。
4它可使多个应用程序和用户用不同的方法在同时或不同时刻去建立,修改和询问数据。
5DBMS提供数据定义语言DDL(Data Definition Language)和数据库操作语言DML(Data Manipulation Language),供用户定义数据库的模式结构与权限约束,实现对数据的追加、删除等操作。
只要做数据处理,软件规模达到一定程度,似乎都称为数据库。
衡量是否是数据库的标准:
ACID,是指在数据库管理系统(DBMS)中事务所具有的四个特性:
1)原子性(Atomicity)
2)一致性(Consistency)
3)隔离性(Isolation)
4)持久性(Durability)
1.2 What is the Relation Database Management System?
历史上的几种类型的数据库
1层次性
2网状型
3关系型
关系数据库,是建立在关系数据库模型基础上的数据库,借助于关系代数等概念和方法来处理数据库中的数据,同时也是一个被组织成一组拥有正式描述性的表格,该形式的表格作用的实质是装载着数据项的特殊收集体,这些表格中的数据能以许多不同的方式被存取或重新召集而不需要重新组织数据库表格。1.3 Why do we need to learn MySQL/PostgreSQL ?
趋势1:云计算,淘汰大部分的运维人员
趋势2:云数据库,淘汰大部分以商业数据库为职业的DBA
趋势3:电商等兴起,对开源数据库技术的人员需求增多
...
1.4 Why do we need to master Query Optimization Technology ?
数据库查询优化技术一直是DBMS实现技术中的精华,也是重点和难点。
...
2 What is the relational algebra ?
数据库中,关系代数是一阶逻辑的分支,是闭合于运算下的关系的集合。运算作用于一个或多个关系上来生成一个关系。关系代数是计算机科学的一部分。
在纯数学中的关系代数是有关于数理逻辑和集合论的代数结构。
SQL的查询语言松散的基于了关系代数,尽管SQL中的操作数(表)不完全是关系,很多有用的关系代数的理论在SQL对应者中不成立。
sql-01
关系代数是一种抽象的查询语言,用对关系的运算来表达查询,作为研究关系数据语言的数学工具。
关系代数的运算对象是关系,运算结果亦为关系。关系代数用到的运算符包括四类:
1)集合运算符
2)专门的关系运算符
3)算数比较符
4)逻辑运算符
比较运算符和逻辑运算符是用来辅助专门的关系运算符进行操作的,所以按照运算符不同,主要将关系代数分为传统的集合运算和专门的关系运算两类。
3 What is the technology Of Query Optimization ?
4 How to learn and master it ?
数据库调优/Database Tuning
数据库调优可以使数据库应用运行得更快,其目标是:
使数据库有更高的吞吐量,更短的响应时间,被调优的对象是整个数据库管理系统总体。
查询语句调优:被调优的对象是一条查询语句。
数据库调优的方式通常有如下几种方式:
1)人工调优,主要依赖于人,效率低下;要求操作者完全理解常识所依赖的原理,还需要对应用、数据库管理系统、操作系统以及硬件有广泛而深刻的理解。最体现维护人员的价值。
2)基于案例的调优,总结典型应用案例情况中数据库参数的推荐配置、数据逻辑层设计等情况,从而为用户的调优工作提供一定的参考和借鉴。但这种方法忽略了系统的动态性和不同的系统间存在的差异。
3)自调优,为数据库系统建立一个模型,根据“影响数据库系统性能效率的因素”,数据库系统自动进行参数的配置。一些商业数据库,实现了部分自调优技术。数据库调优五个阶段的主要技术
1应用情况的估算。
应用的使用方式(把业务逻辑转换为数据库的读写分布逻辑,以是读多写少还是读写均衡等来区分OLTP和OLAP;应用对数据库的并发情况、并发是否可以池化等)、数据量、对数据库的压力、峰值压力等做一个预估。
2系统选项策略
确定什么样的数据库可以适用应用需求,并确定数据库是使用开源的还是商业的,是集使用群还是单机系统,同时对操作系统、中间件、硬件、网络等进行选型。
3数据模型的设计
主要是根据业务逻辑,从几个角度考虑表的逻辑结构,如下:
3.1 E-R模型设计:遵循了E-R模型设计原理。偶尔的适当程度的非规范化可以改善系统查询性能。
3.2 数据逻辑分布策略:目的是减少数据请求的不必要的数据量,把用户需要的数据返回;可用的技术如分区、用E-R模型分表等(如互联网企业典型的用法,根据业务不同,进行分库,分表等操作)。
3.3数据物理存储策略:目的是减少IO,如启用压缩技术、把索引和表数据的存储分开,不同的表数据分布于不同的表空间,不同的表空间分布在不同的物理存储上(尤其是读写量大的表空间分布在不同的物理存储上)、日志、索引和数据分布在不同的物理存储上等。
3.4索引:在查询频繁的对象上建立合适的索引,使索引的正效应大于负效应(索引的维护存在消耗)。
4SQL设计
编写正确的、查询效率高的SQL语句。这依据的主要是“查询重写规则”,编写语句的过程中要注意,要有意识地保障SQL能利用到索引。
5数据库功能的启用
数据库为提高性能提供了一些功能,可合理使用,具体如下:
5.1查询重用:根据实际情况进项配置,可缓存查询执行计划、查询结果等。
5.2数据库参数的设置:可设置系统上模拟实际运行环境,加大压力进行系统测试,提前发现问题。
6系统监控与分析。在工业环境下,加强对系统的运行监控和日常的分析工作,具体如下:
6.1应用系统表现:收集用户对应用系统的使用意见、系统存在问题等,因为这些可能是用户在第一时间发现的。
6.2OS环境监控:实时监控CPU、内存、IO等,并对比实时情况与历史正常情况。
6.3据库内部装况监控:一些数据库提供系统表、视图、工具等手段,向用户提供数据库运行过程中内部状况的信息,如锁的情况,这些都需要实时监控,并对比实时情况与历史正常情况。
6.4日志分析:在数据库的日志、操作系统的日志中找出异常事件,定位问题。
(二)
1.1 Query Reuse
查询重用是指尽可能利用先前的执行结果,以达到节约查询计算全过程的时间并减少资源消耗的目的。
目前查询重用技术主要集中在两个方面:
1查询结果的重用。在缓存区中分配一块缓冲块,存放该SQL语句文本和最后的结果集,当同样的SQL输入时,直接把结果返回。查询结果的重用技术节约了查询计划生成时间,减少了查询执行全过程的资源消耗。
2查询计划的重用。缓存一条查询语句的执行计划及其相应语法树结构。查询计划的重用技术减少了查询计划生成的时间和资源消耗。
查询重用技术利弊:
1弊端:结果集很大会消耗很大的内存资源,同样的SQL不同用户应该获取的结果集可能不同
2利端:节约了CPU和IO消耗。在实际使用的过程中,趋利避害,根据实际情况选用
1.2 Query Rewrite
查询重写:
是查询语句的一种等价转换,即对于任何相关模式的任意状态都会产生相同的结果。
查询重写的两个目标:
1将查转换为等价的效率更高的形式,例如将效率低的谓词转换为效率高的谓词、消除重复条件等。
2尽量将查询重写为等价、简单且不受表顺序限制的形式,为物理查询优化阶段提供更多的选择,如视图的重写、子查询的合并转换等。
查询重写的依据:查询重写的依据,是关系代数。
1关系代数的等价变换规则对查询重写提供了理论上的支持。
2查询重写后,查询优化器可能生成多个连接路径,可以从候选者中择优。
查询优化技术类型:
1语法级:查询语言层的优化,基于语法进行优化。
2代数级:查询使用形式逻辑进行优化,运用关系代数的原理进行优化。
3语义级:根据完整性约束,对查询语句进行语义理解,推知一些可优化的操作。
4物理级:物理优化技术,基于代价估算模型,比较得出各种执行方式中代价最小的。
查询重写是基于语法级、代数级、语义级的优化,可以统一归属到逻辑优化的范畴;基于代价估算模型是物理层面的优化,是从连接路径中选择代价最小的路径的过程。
查询重写思路:
1将过程性查询转换为描述性的查询,如视图重写。
2将复杂的查询(如嵌套子查询、外连接消除、嵌套连接消除)尽可能转换为多表连接查询
3将效率低的谓词转换为等价的效率高的谓词(如等价谓词重写)。
4利用等式和不等式的性质,简化WHERE、HAVING条件。
5如何改进现有查询重写规则的效率,如何发现更多更有效的重写规则,是查询优化的研究内容之一。
常见的查询重写技术类型,每一类都有自己的规则,这些规则没有确定的、统一的规律,但重写的核心一定是“等价转换”,只有等价才能转换,这是需要特别强调的。
1.3Query Optimization Algorithm
什么是查询优化算法?
查询优化,求解给定查询语句的高效执行计划的过程。这样的过程,包括了多种子问题求解,不同的子问题,对应了不同的解决办法,即算法。
什么是查询计划?
查询计划,也称为查询树,它由一系列内部的操作符组成,这些操作符按一定的运算关系构成查询的一个执行方案。
简单说,就是表A和表B先连接得到中间结果,然后再和另外的表C连接得到新的中间方式,直至所有表都被连接完毕。查询计划,二叉树上的不同结点:
单表结点。考虑单表的数据获取方式:
1直接通过IO获得数据
2通过索引获取数据
3通过索引定位数据的位置后再经过IO到数据块中获取数据
这是一个从物理存储到内存解析成逻辑字段的过程,即符合冯·诺依曼体系结构的要求(外存数据读入内存才能被处理)
两表结点(两表连接结点)
考虑两表以何种方式连接、代价有多大、连接路径有哪些等。表示的是内存中的元祖,怎么进行元祖间的连接。此时,元祖通常已经存在于内存,直接使用即可。这是一个完成用户语义的逻辑操作,但是只是局部操作,只涉及两个具体的关系。完成用户全部语义(用户连接的语义),需要配合多表的连接顺序操作。
不同的连接算法导致的连接效率不同,如数据量大可使用嵌套连接,数据如果有序可使用归并连接等。
多表结点。
考虑多表连接顺序如何构成代价最少的“执行计划”。决定是AB先连接还是BC先连接,这是一个比较花费大小的运算。如果太多的连接方式被判断,也会导致效率问题。
多个关系采用不同次序进行连接,花费的CPU资源、内存资源差异可能比较大。
许多数据库采用左深树、右深树、紧密树三种方式或其中一部分对多表进行连接得到多种连接路径。
生成最优查询计划的策略:
1基于规则优化。
根据经验或一些已经探知或被证明有效的方式,定义为“规则”(如根据关系代数得知的规则、根据经验得知的规则等),用这些规则化简单查询计划生成过程中符合可被化简的操作,使用启发式规则排除一些明显不好的存取路径,这就是基于规则的优化。
2基于代价优化
根据一个代价评估模型,在生成查询计划的过程中,计算每条存储路径(存取路径主要包括上述三个”关系结点“)的花费,然后选择代价最小的作为子路径,这样直至所有表连接完毕得到一个完整的路径。
代价计算公式:
总代价=CPU代价+IO代价
主流数据库都采用了基于代价策略进行优化的技术。
主流数据库对于基于规则和基于代价的技术,都在使用~
基于规则优化具有操作简单且能快速确定连接方式的优点,但这种方法只是排除了一部分不好的可能,所以得到的结果未必是最好的;
基于代价优化,是对各种可能的情况进行量化比较,从而可以得到花费最小的情况,但如果组合情况比较多则花费的判断时间就会很多
查询优化器的实现,多是两种优化策略组合使用。
查询优化为什么要并行?
传统单机数据库系统中,给定一个查询(Query),查询优化算法只需找到查询的一个具有最小执行花费的执行计划,这样的计划必定具有最快的响应时间。
在并行数据库系统中,查询优化的目标是寻找具有最小响应时间的查询执行计划。者需要把查询工作分解为一些可以并行运行的子工作。一些商业数据库提供了并行查询功能,用以优化查询执行操作。
查询优化并行的条件:
一个查询能否并行执行,取决于多种因素:
1系统中的可用资源(如内存、高速缓存中的数据量等)。
2CPU的数目。
3运算中的特定代数运算符。
如A、B、C、D四个表进行连接,每个表的单表扫描可以并行进行;在生成四个表连接的查询计划过程中,可以选择A和B连接的同时C和D进行连接,这样连接操作能并行运行(操作间并行)。
不同商业数据库,对查询并行的实现也不尽相同。
在同一个SQL内,查询并行可以分为:
1操作内并行。将同一操作如单表扫描操作、两表连接操作、排序操作等分解成多个独立的子操作,由不同的CPU同时执行。
2操作间并行。一条SQL查询语句可以分解成多个子操作,由多个CPU执行。
Distributrd Query Optimization
在分布式数据库系统中,查询策略优化是查询优化的重点。
主要是数据传输策略,A、B两结点的数据进行连接,是A结点数据传输到B结点或者是从B到A或是先各自进行过滤然后再传输等,和局部处理优化(传统的单结点数据库的查询优化技术)
在查询优化策略中,数据的通信开销是优化算法考虑的主要因素。分布式查询优化以减少传输的次数和数据量作为查询优化的目标。
分布式数据库系统中的代价估算模型,除了考虑CPU代价和I/O代价外,还要考虑通过网络在结点间传输数据的代价。这是分布式并行查询优化技术与传统单结点数据系统最大的不同之处。
在分布式数据库系统中,代价估算模型为:总代价=I/O代价+CPU代价=通信代价。 -
数据库查询优化算法
2007-06-05 10:36:24一共有三种经典的查询优化算法,真的值得一看,懂的下吧.... -
数据库查询优化——Mysql索引
2016-05-16 12:37:47对于任何DBMS,索引都是进行优化的最主要的因素。对于少量的数据,没有合适的索引影响不是很大,但是,当随着数据量的增加,性能会急剧下降。小宝鸽试了一下,2.5万数据单表中,无索引:200ms-700ms,添加索引后10ms...工作一年了,也是第一次使用Mysql的索引。添加了索引之后的速度的提升,让我惊叹不已。隔壁的老员工看到我的大惊小怪,平淡地回了一句“那肯定啊”。
对于任何DBMS,索引都是进行优化的最主要的因素。对于少量的数据,没有合适的索引影响不是很大,但是,当随着数据量的增加,性能会急剧下降。
小宝鸽试了一下,2.5万数据单表中,无索引:200ms-700ms,添加索引后10ms-15ms,使用redis缓存1ms-7ms,如果数据量更大的时候,索引效果将会更加明显。更甚者,多表查询。
索引原理
1、除了词典,生活中随处可见索引的例子,如火车站的车次表、图书的目录等。它们的原理都是一样的,通过不断的缩小想要获得数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是我们总是通过同一种查找方式来锁定数据。
数据库也是一样,但显然要复杂许多,因为不仅面临着等值查询,还有范围查询(>、<、between、in)、模糊查询(like)、并集查询(or)等等。数据库应该选择怎么样的方式来应对所有的问题呢?我们回想字典的例子,能不能把数据分成段,然后分段查询呢?最简单的如果1000条数据,1到100分成第一段,101到200分成第二段,201到300分成第三段……这样查第250条数据,只要找第三段就可以了,一下子去除了90%的无效数据。但如果是1千万的记录呢,分成几段比较好?稍有算法基础的同学会想到搜索树,其平均复杂度是lgN,具有不错的查询性能。但这里我们忽略了一个关键的问题,复杂度模型是基于每次相同的操作成本来考虑的,数据库实现比较复杂,数据保存在磁盘上,而为了提高性能,每次又可以把部分数据读入内存来计算,因为我们知道访问磁盘的成本大概是访问内存的十万倍左右,所以简单的搜索树难以满足复杂的应用场景。
2、另外,比如学生信息表,添加学生姓名索引,索引是在name上排序的。现在,当查找某个学生信息时,就不需要逐行搜索全表,可以利用索引进行有序查找(如二分查找法),并快速定位到匹配的值,以节省大量搜索时间。
3、是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍。
例如,有3个未索引的表t1、t2、t3,分别只包含列c1、c2、c3,每个表分别含有1000行数据组成,指为1~1000的数值,查找对应值相等行的查询如下所示。SELECT c1,c2,c3 FROM t1,t2,t3 WHERE c1=c2 AND c1=c3
此查询结果应该为1000行,每行包含3个相等的值。在无索引的情况下处理此查询,必须寻找3个表所有的组合,以便得出与WHERE子句相配的那些行。而可能的组合数目为1000×1000×1000(十亿),显然查询将会非常慢。
如果对每个表进行索引,就能极大地加速查询进程。利用索引的查询处理如下。
(1)从表t1中选择第一行,查看此行所包含的数据。
(2)使用表t2上的索引,直接定位t2中与t1的值匹配的行。类似,利用表t3上的索引,直接定位t3中与来自t1的值匹配的行。
(3)扫描表t1的下一行并重复前面的过程,直到遍历t1中所有的行。
在此情形下,仍然对表t1执行了一个完全扫描,但能够在表t2和t3上进行索引查找直接取出这些表中的行,比未用索引时要快一百万倍。
利用索引,MySQL加速了WHERE子句满足条件行的搜索,而在多表连接查询时,在执行连接时加快了与其他表中的行匹配的速度。
索引的类型
MySQL的索引包括普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引等。
1.普通索引
在创建普通索引时,不附加任何限制条件。这类索引可以创建在任何数据类型中,其值是否唯一和非空由字段本身的完整性约束条件决定。建立索引以后,查询时可以通过索引进行查询。例如,在student表的stu_id字段上建立一个普通索引。查询记录时,就可以根据该索引进行查询。
2.唯一性索引
使用UNIQUE参数可以设置索引为唯一性索引。在创建唯一性索引时,限制该索引的值必须是唯一的。例如,在student表的stu_name字段中创建唯一性索引,那么stu_name字段的值就必需是唯一的。通过唯一性索引,可以更快速地确定某条记录。主键就是一种特殊唯一性索引。
3.全文索引
使用FULLTEXT参数可以设置索引为全文索引。全文索引只能创建在CHAR、VARCHAR或TEXT类型的字段上。查询数据量较大的字符串类型的字段时,使用全文索引可以提高查询速度。例如,student表的information字段是TEXT类型,该字段包含了很多的文字信息。在information字段上建立全文索引后,可以提高查询information字段的速度。MySQL数据库从3.23.23版开始支持全文索引,但只有MyISAM存储引擎支持全文检索。在默认情况下,全文索引的搜索执行方式不区分大小写。但索引的列使用二进制排序后,可以执行区分大小写的全文索引。
4.单列索引
在表中的单个字段上创建索引。单列索引只根据该字段进行索引。单列索引可以是普通索引,也可以是唯一性索引,还可以是全文索引。只要保证该索引只对应一个字段 即可。
5.多列索引
多列索引是在表的多个字段上创建一个索引。该索引指向创建时对应的多个字段,可以通过这几个字段进行查询。但是,只有查询条件中使用了这些字段中第一个字段时,索引才会被使用。例如,在表中的id、name和sex字段上建立一个多列索引,那么,只有查询条件使用了id字段时该索引才会被使用。
6.空间索引
使用SPATIAL参数可以设置索引为空间索引。空间索引只能建立在空间数据类型上,这样可以提高系统获取空间数据的效率。MySQL中的空间数据类型包括GEOMETRY和POINT、LINESTRING和POLYGON等。目前只有MyISAM存储引擎支持空间检索,而且索引的字段不能为空值。对于初学者来说,这类索引很少会用到。
索引的操作
1.添加PRIMARY KEY(主键索引)
mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )
2.添加UNIQUE(唯一索引)
mysql>ALTER TABLE `table_name` ADD UNIQUE ( `column` )
3.添加INDEX(普通索引)
mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column` )
4.添加FULLTEXT(全文索引)
mysql>ALTER TABLE `table_name` ADD FULLTEXT ( `column`)
5.添加多列索引
mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )
创建索引
在执行CREATE TABLE语句时可以创建索引,也可以单独用CREATE INDEX或ALTER TABLE来为表增加索引。
1.ALTER TABLE
ALTER TABLE用来创建普通索引、UNIQUE索引或PRIMARY KEY索引。
ALTER TABLE table_name ADD INDEX index_name (column_list) ALTER TABLE table_name ADD UNIQUE (column_list) ALTER TABLE table_name ADD PRIMARY KEY (column_list)
其中table_name是要增加索引的表名,column_list指出对哪些列进行索引,多列时各列之间用逗号分隔。索引名index_name可选,缺省时,MySQL将根据第一个索引列赋一个名称。另外,ALTER TABLE允许在单个语句中更改多个表,因此可以在同时创建多个索引。
2.CREATE INDEX
CREATE INDEX可对表增加普通索引或UNIQUE索引。
CREATE INDEX index_name ON table_name (column_list) CREATE UNIQUE INDEX index_name ON table_name (column_list)
table_name、index_name和column_list具有与ALTER TABLE语句中相同的含义,索引名不可选。另外,不能用CREATE INDEX语句创建PRIMARY KEY索引。
3.索引类型
在创建索引时,可以规定索引能否包含重复值。如果不包含,则索引应该创建为PRIMARY KEY或UNIQUE索引。对于单列惟一性索引,这保证单列不包含重复的值。对于多列惟一性索引,保证多个值的组合不重复。
PRIMARY KEY索引和UNIQUE索引非常类似。事实上,PRIMARY KEY索引仅是一个具有名称PRIMARY的UNIQUE索引。这表示一个表只能包含一个PRIMARY KEY,因为一个表中不可能具有两个同名的索引。下面的SQL语句对students表在sid上添加PRIMARY KEY索引。
ALTER TABLE students ADD PRIMARY KEY (sid)
删除索引
可利用ALTER TABLE或DROP INDEX语句来删除索引。类似于CREATE INDEX语句,DROP INDEX可以在ALTER TABLE内部作为一条语句处理,语法如下。
DROP INDEX index_name ON talbe_name ALTER TABLE table_name DROP INDEX index_name ALTER TABLE table_name DROP PRIMARY KEY
其中,前两条语句是等价的,删除掉table_name中的索引index_name。
第3条语句只在删除PRIMARY KEY索引时使用,因为一个表只可能有一个PRIMARY KEY索引,因此不需要指定索引名。如果没有创建PRIMARY KEY索引,但表具有一个或多个UNIQUE索引,则MySQL将删除第一个UNIQUE索引。
如果从表中删除了某列,则索引会受到影响。对于多列组合的索引,如果删除其中的某列,则该列也会从索引中删除。如果删除组成索引的所有列,则整个索引将被删除。
注:一般数据库默认都会为主键生成索引
参考文章:
http://blog.csdn.net/yuanzhuohang/article/details/6497021
http://www.cnblogs.com/hustcat/archive/2009/10/28/1591648.html
http://edu.cnzz.cn/201305/88671f51.shtml -
数据库查询优化策略
2017-05-04 21:32:55数据库查询优化逻辑层查询优化策略1.尽可能的早做选择和投影(基本思路):可以使中间结果变小,节省几个数量级的执行时间 2.把选择和投影串接起来:一元运算序列可一起执行,只需对整个关系进行一趟扫描 3.把投影...数据库查询优化
逻辑层查询优化策略
1.尽可能的早做选择和投影(基本思路):可以使中间结果变小,节省几个数量级的执行时间
2.把选择和投影串接起来:一元运算序列可一起执行,只需对整个关系进行一趟扫描
3.把投影与其前或后的二元运算结合:在第一次用关系时去掉一些无关属性,可以避免多次扫描整个关系
4.把某些选择与其前的笛卡尔积合并成一个连接:当RxS前有选择运算且其中条件是R,S属性间比较运算的时。可以将其转换为连接运算节省时间
5.执行连接运算前对关系做适当的预处理:排序,索引
6.找出表达式里的公共子表达式:若公共的子表达式结果不大,则预先计算,以后直接读入结果,尤当视图情况下使用- 关系代数的基本操作
并(Union)交(Intersect)差(Except) 选择 投影
待优化查询示例背景
图书馆关系数据库
books(title,author,pname,lc_no); publishers(pname,padder,pciy) borrowers(name,addr,city,card_no) loans(card_no,lc_no,date) pname为出版社名,lc_no图书馆编目号 padder为出版社地址,pcity为出版社所在地 name为读者名,addr为读者所在地址,city为读者所在城市,card_no为图书证号,date为借出日期
创建视图 CREATE VIEW xloans( select title,author,pname,lc_no,name,addr,city,card_no,date from books bs,borrowers b,loans l where bs.lc_no=l.lc_no and b.card_no=l.card_no );
关系代数 xloans=⊓s (σ F (loans x booksb x orrowers)) s=title,author,pname,lc_no,name,addr,city,card_no,date F=(bs.lc_no=l.lc_no)∧ b.card_no=l.card_no
基本关系代数的等价变换公式
select title from xloans where date<=1/1/79; ⊓ title (σ date<=’1/1/79’ (xloans))
物理查询优化策略
DBMS衡量物理查询计划的优劣,I/O 访问次数,cpu占用时间,网络通信量等。
- oracle收集统计信息放入表中
anlalyze {index|table|cluster} {indexname|tablename|clustername} compute statistics {for table|for all[indexed] |columns[size n]}
- 进行代价估算
-
分布式数据库查询优化算法研究与实现
2012-12-05 16:34:02分布式数据库系统是...据在网络上的传输,因此查询处理和优化就成为分布式数据库提高查询性能的关 键因素。查询处理和优化就是通过合理的算法尽量减少通信的信息量,从而提高 查询的响应时间性能以及减少系统开销。 -
从Mysql-EXPLAIN探寻数据库查询优化
2016-10-17 14:30:46从Mysql-EXPLAIN探寻数据库查询优化 -
数据库查询优化复盘-20条必备sql优化技巧
2020-12-08 08:29:00长按识别下方二维码,即可"关注"公众号每天早晨,干货准时奉上!0、序言本文我们来谈谈项目中常用的 20 条 MySQL 优化方法,效率至少提高 3倍!具体如下:1、使⽤ ... -
数据库查询优化论文
2008-08-02 23:45:25这是一片详细的介绍数据库查询优化的研究性论文。 -
PB对数据库查询的优化.doc
2022-04-02 09:13:52PB对数据库查询的优化.PB对数据库查询的优化.PB对数据库查询的优化.PB对数据库查询的优化.PB对数据库查询的优化.PB对数据库查询的优化.PB对数据库查询的优化.PB对数据库查询的优化.PB对数据库查询的优化.PB对数据库... -
数据库的查询优化方法
2018-09-06 15:26:071.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id ... -
MySQL 常见的数据库查询性能优化手段
2021-08-24 11:17:31简单介绍了一些常见MySQL数据库优化手段,比如减少数据访问、使用索引、使用关联查询等等。 -
数据库查询优化-添加索引
2019-08-26 22:01:20对于开发人员,说起数据查询优化,最简单也是最常用的一个方案就是创建索引。可以说索引是所有开发人员接触的第一个查询优化的方案。 在数据库中,我们通过创建索引可以大大提高查询的速度,一个好的索引可以另SQL... -
论文研究-分布式数据库的查询优化研究 .pdf
2019-08-16 11:36:20分布式数据库的查询优化研究,王欣,,本文首先介绍了分布式数据库的机制和特点,并介绍了分布式查询的步骤。然后探讨了分布式查询优化的目标,指出在分布式数据库系统 -
数据库查询优化问题求帮忙
2015-10-11 23:59:18查询结果集的时候还要查询本次有多少条数据 使用count的话就考虑sql太复杂,于是没办法使用size,效率又好低 有没遇到相似情况的帮忙提供个解决方案或者思路 -
基于半连接的分布式数据库查询优化算法探讨
2013-06-18 00:27:16分布式数据库查询优化算法,分布式数据库最后的作业参考,大家可以借鉴下哈! -
数据库查询优化浅析
2013-01-11 10:23:29数据库查询优化浅析,数据库详细解说,图解 -
分布式数据库系统的查询优化策略研究 (2007年)
2021-05-16 02:48:14在分析比较分布式数据库系统和集中式数据库系统查询优化目标不同特点的基础上,归纳出分布式数据库系统的查询 优化目标,进而提出查询优化的策略,并在举例中重点讨论了操作执行顺序的不同对查询性能的影响 。 -
关系数据库的查询优化
2018-07-17 16:29:43关系查询优化是影响关系数据库管理系统性能的关键因素。 一、查询优化概述 查询优化的优点不仅在于用户不必考虑如何最好地表达查询以获得较高的效率,而且在于系统可以比用户程序的“优化”做得更好。 1. 优化...