《MySql索引原理解析-马龙组ppt课件.pptx》由会员分享,可在线阅读,更多相关《MySql索引原理解析-马龙组ppt课件.pptx(36页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、MySqlMySqlMySqlMySql索引原理解析索引原理解析索引原理解析索引原理解析(B B B B+treetreetreetree)ByBy 马龙马龙-代码帅,运行快代码帅,运行快组员:陈诗华 李佳李佳 刘刘伟杰杰 周文兵周文兵 孔敢孔敢火灾袭来时要迅速疏散逃生,不可蜂拥而出或留恋财物,要当机立断,披上浸湿的衣服或裹上湿毛毯、湿被褥勇敢地冲出去工作分配 数据库索引数据库索引数据库索引数据库索引PPTPPTPPTPPT整体的构造和思路整体的构造和思路整体的构造和思路整体的构造和思路 展示讲解数据库的索引展示讲解数据库的索引展示讲解数据库的索引展示讲解数据库的索引 数据库结构的分类数据库结
2、构的分类数据库结构的分类数据库结构的分类(对应不同的数据库存储引擎对应不同的数据库存储引擎对应不同的数据库存储引擎对应不同的数据库存储引擎)物理分类物理分类物理分类物理分类 逻辑分类、逻辑分类、逻辑分类、逻辑分类、PPTPPTPPTPPT制作制作制作制作火灾袭来时要迅速疏散逃生,不可蜂拥而出或留恋财物,要当机立断,披上浸湿的衣服或裹上湿毛毯、湿被褥勇敢地冲出去索引的分类 索索引引的的分分类类大大致致可可以以从从逻逻辑辑分分类类,物物理理分分类类以以及及数数据据结结构构分分类类这这三个方面来阐述:三个方面来阐述:数据结构分类:数据结构分类:(1 1)B+B+树索引树索引(O(log(n)(O(l
3、og(n)(底层重点)(底层重点)(2 2)hashhash索引索引 (3 3)FULLTEXTFULLTEXT索引索引 (4 4)R-TreeR-Tree索引索引 物理分类:(对应于不同的数据库存储引擎):物理分类:(对应于不同的数据库存储引擎):(1)聚集索引(clustered index):InnoDB存储引擎 (2)非聚集索引(non-clustered index):MyISAM存储引擎 逻辑分类(重点)逻辑分类(重点):(1)普通索引或者单列索引 (2)唯一索引 (3)主键索引 (4)组合索引火灾袭来时要迅速疏散逃生,不可蜂拥而出或留恋财物,要当机立断,披上浸湿的衣服或裹上湿毛毯
4、、湿被褥勇敢地冲出去STAR磁盘IO与预读 磁盘IO:磁盘读取数据靠的是机械运动,每次读取数据花费的时间可以分为寻道时间、旋转延迟、传输时间三个部分,寻道时间指的是磁臂移动到指定磁道所需要的时间,主流磁盘一般在5ms以下;旋转延迟就是我们经常听说的磁盘转速,比如一个磁盘7200转,表示每分钟能转7200次,也就是说1秒钟能转120次,旋转延迟就是1/120/2=4.17ms;传输时间指的是从磁盘读出或将数据写入磁盘的时间,一般在零点几毫秒,相对于前两个时间可以忽略不计。那么访问一次磁盘的时间,即一次磁盘IO的时间约等于5+4.17=9ms左右,听起来还挺不错的,但要知道一台500-MIPS的机
5、器每秒可以执行5亿条指令,因为指令依靠的是电的性质,换句话说执行一次IO的时间可以执行40万条指令,数据库动辄十万百万乃至千万级数据,每次9毫秒的时间,显然是个灾难。火灾袭来时要迅速疏散逃生,不可蜂拥而出或留恋财物,要当机立断,披上浸湿的衣服或裹上湿毛毯、湿被褥勇敢地冲出去STAR磁盘IO与预读 预读:考虑到磁盘IO是非常高昂的操作,计算机操作系统做了一些优化,当一次IO时,不光把当前磁盘地址的数据,而且把相邻的数据也都读取到内存缓冲区内,因为局当计算机访问一个地址的数据的时候,与其相邻的数据也会很快被访问到。每一次IO读取的数据我们称之为一页(page)。部预读性原理告诉我们,具体一页有多大
6、数据跟操作系统有关,一般为4k或8k,也就是我们读取一页内的数据时候,实际上才发生了一次IO,这个理论对于索引的数据结构设计非常有帮助。火灾袭来时要迅速疏散逃生,不可蜂拥而出或留恋财物,要当机立断,披上浸湿的衣服或裹上湿毛毯、湿被褥勇敢地冲出去 数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B-tree及其变种B+tree。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。MySQL官方对索引的定义为:索引(Index)是
7、帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构。火灾袭来时要迅速疏散逃生,不可蜂拥而出或留恋财物,要当机立断,披上浸湿的衣服或裹上湿毛毯、湿被褥勇敢地冲出去STAR什么是索引 索引是一种允许直接访问数据表中某一数据行的树型结构,为了提高查询效率而引入,是独立于表的对象,可以存放在与表不同的表空间(TABLESPACE)中。索引记录中存有索引关键字和指向表中数据的指针(地址)。对索引进行的I/O操作比对表进行操作要少很多。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。B+tree索引的结构7火灾袭来时要迅速疏散逃生,不可蜂拥而出或
8、留恋财物,要当机立断,披上浸湿的衣服或裹上湿毛毯、湿被褥勇敢地冲出去STAR索引的本质目前大部分数据库系统及文件系统都采用B-Tree或其变种B+Tree作为索引结构。這里主要介绍使用较为广泛的B+Tree火灾袭来时要迅速疏散逃生,不可蜂拥而出或留恋财物,要当机立断,披上浸湿的衣服或裹上湿毛毯、湿被褥勇敢地冲出去STARB+树详解左边的图中,其中17表示一个磁盘文件的文件名;小红方块表示这个17文件内容在硬盘中的存储位置;p1表示指向17左子树的指针。我们假设一个盘块刚好只能存储一个结点,那么左图中一个结点就表示一个盘块,其子树指针就是指向另一个盘块的地址。现在我们来模拟查找文件29的过程:根
9、据根结点指针找到文件目录的根磁盘块1,将其中的信息导入内存。【磁盘IO操作 1次】此时内存中有两个文件名17、35和三个存储其他磁盘页面地址的数据。火灾袭来时要迅速疏散逃生,不可蜂拥而出或留恋财物,要当机立断,披上浸湿的衣服或裹上湿毛毯、湿被褥勇敢地冲出去B+树查找过程根据算法我们发现:172935,因此我们找到指针p2。根据p2指针,我们定位到磁盘块3,并将其中的信息导入内存。【磁盘IO操作 2次】此时内存中有两个文件名26,30和三个存储其他磁盘页面地址的数据。根据算法我们发现:262930,因此我们找到指针p2。根据p2指针,我们定位到磁盘块8,并将其中的信息导入内存。【磁盘IO操作 3
10、次】此时内存中有两个文件名28,29。根据算法我们查找到文件名29,并 定 位 了 该 文 件 内 存 的 磁 盘 地 址。分析上面的过程,发现需要3次磁盘IO操作和3次内存查找操作。真实的情况是,3层的b+树可以表示上百万的数据,如果上百万的数据查找只需要三次IO,性能提高将是巨大的,如果没有索引,每个数据项都要发生一次IO,那么总共需要百万次的IO,显然成本非常非常高。火灾袭来时要迅速疏散逃生,不可蜂拥而出或留恋财物,要当机立断,披上浸湿的衣服或裹上湿毛毯、湿被褥勇敢地冲出去火灾袭来时要迅速疏散逃生,不可蜂拥而出或留恋财物,要当机立断,披上浸湿的衣服或裹上湿毛毯、湿被褥勇敢地冲出去STAR
11、B+树性质 1.通过上面的分析,我们知道IO次数取决于b+树的高度h,假设当前数据表的数据为N,每个磁盘块的数据项的数量是m,则有h=(m+1)N,当数据量N一定的情况下,m越大,h越小;而m=磁盘块的大小/数据项的大小,磁盘块的大小也就是一个数据页的大小,是固定的,如果数据项占的空间越小,数据项的数量越多,树的高度越低。这就是为什么每个数据项,即索引字段要尽量的小,比如int占4字节,要比bigint8字节少一半。这也是为什么b+树要求把真实的数据放到叶子节点而不是内层节点,一旦放到内层节点,磁盘块的数据项会大幅度下降,导致树增高。当数据项等于1时将会退化成线性表。火灾袭来时要迅速疏散逃生,
12、不可蜂拥而出或留恋财物,要当机立断,披上浸湿的衣服或裹上湿毛毯、湿被褥勇敢地冲出去STARB+树性质2.当b+树的数据项是复合的数据结构,比如:(name,age,sex)的时候,b+树是按照从左到右的顺序来建立搜索树的,比如当(张三,20,F)这样的数据来检索的时候,b+树会优先比较name来确定下一步的所搜方向,如果name相同再依次比较age和sex,最后得到检索的数据;但当(20,F)这样的没有name的数据来的时候,b+树就不知道下一步该查哪个节点,因为建立搜索树的时候name就是第一个比较因子,必须要先根据name来搜索才能知道下一步去哪里查询。比如当(张三,F)这样的数据来检索时
13、,b+树可以用name来指定搜索方向,但下一个字段age的缺失,所以只能把名字等于张三的数据都找到,然后再匹配性别是F的数据了,这个是非常重要的性质,即索引的最左匹配特性。火灾袭来时要迅速疏散逃生,不可蜂拥而出或留恋财物,要当机立断,披上浸湿的衣服或裹上湿毛毯、湿被褥勇敢地冲出去STAR带有顺序访问指针的B+Tree 一般在数据库系统或文件系统中使用的B+Tree结构都在经典B+Tree的基础上进行了优化,增加了顺序访问指针。在B+Tree的每个叶子节点增加一个指向相邻叶子节点的指针,就形成了带有顺序访问指针的B+Tree。做这个优化的目的是为了提高区间访问的性能,例如上图中如果要查询key为
14、从18到49的所有数据记录,当找到18后,只需顺着节点和指针顺序遍历就可以一次性访问到所有数据节点,极大提到了区间查询效率。火灾袭来时要迅速疏散逃生,不可蜂拥而出或留恋财物,要当机立断,披上浸湿的衣服或裹上湿毛毯、湿被褥勇敢地冲出去STARB+tree原理解析一棵 m 阶B+树可以定义如下:树中每个非叶结点最多有 m 棵子树,m个关键字;根结点(非叶结点)至少有 2 棵子树。除根结点外,其它的非叶结点至少有|m/2|棵子树;有 n 棵子树的非叶结点有 n 个关键码。所有叶结点都处于同一层次上,包含了全部关键码及指向相应数据对象存放地址的指针,且叶结点本身按关键码从小到大顺序链接;若设结点可容纳
15、最大关键码数为 x,则指向对象的地址指针也有x个。结点中的子树棵数 n 应满足 n 属于m/2,m若根结点同时又是叶结点,则结点格式同叶结点。火灾袭来时要迅速疏散逃生,不可蜂拥而出或留恋财物,要当机立断,披上浸湿的衣服或裹上湿毛毯、湿被褥勇敢地冲出去STARB+tree原理解析所有的非叶结点可以看成是索引部分,非叶子结点的子树指针Pi,指向关键字值属于Ki,Ki+1)的子树(B-树是开区间),构成对子树(即下一层索引块)的索引项 特别地,子树指针 P0 所指子树上所有关键码均小于 K1。结点格式同B树。叶结点中存放的是对实际数据对象的索引。在B+树中有两个头指针:一个指向B+树的根结点,一个指
16、向关键码最小的叶结点。所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。b+tree的下一层节点中,包含上层节点里所有的key火灾袭来时要迅速疏散逃生,不可蜂拥而出或留恋财物,要当机立断,披上浸湿的衣服或裹上湿毛毯、湿被褥勇敢地冲出去STAR存储引擎简介在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,主流存储引擎有:MyISAM和InnoDB两个存储引擎。在MySQL中,InnoDB引擎表是(聚集)索引组织表(clustered index organize table),支持事务处理,聚集索引
17、(clustered index);而MyISAM引擎表则是堆组织表(heap organize table),不支持事务处理高级特性,非聚集索引。(non-clustered index)。聚集索引是一种索引组织形式,索引的键值逻辑顺序决定了表数据行的物理存储顺序,而非聚集索引则就是普通索引了,仅仅只是对数据列创建相应的索引,不影响整个表的物理存储顺序。火灾袭来时要迅速疏散逃生,不可蜂拥而出或留恋财物,要当机立断,披上浸湿的衣服或裹上湿毛毯、湿被褥勇敢地冲出去我们来看看两种存储形式的不同之处:简单说,IOT表里数据物理存储顺序和主键索引的顺序一致,所以如果新增数据是离散的,会导致数据块趋于离
18、散,而不是趋于顺序。而HOT表数据写入的顺序是按写入时间顺序存储的。IOT表相比HOT表的优势是:范围查询效率更高;数据频繁更新(聚集索引本身不更新)时,更不容易产生碎片;特别适合有一小部分热点数据频繁读写的场景;通过主键访问数据时快速可达;火灾袭来时要迅速疏散逃生,不可蜂拥而出或留恋财物,要当机立断,披上浸湿的衣服或裹上湿毛毯、湿被褥勇敢地冲出去IOT表的不足则有:数据变化如果是离散为主的话,那么效率会比HOT表差;HOT表的不足有:大部分数据读取时随机的,无法保证被顺序读取,开销大;一般来说:当你的数据库有大量的写入、更新操作而查询比较少或者数据完整性要求比较高的时候就选择mysiam表。
19、当你的数据库主要以查询为主,相比较而言更新和写入比较少,并且业务方面数据完整性要求不那么严格,就选择innoDb表。火灾袭来时要迅速疏散逃生,不可蜂拥而出或留恋财物,要当机立断,披上浸湿的衣服或裹上湿毛毯、湿被褥勇敢地冲出去STAR20假如我们创建了一个 user表:CREATE TABLE user(id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50)NOT NULL,age INT,addr VARCHAR(200),image MEDIUMBLOB(2000);火灾袭来时要迅速疏散逃生,不可蜂拥而出或留恋财物,要当机立断,披上浸湿的衣服或裹
20、上湿毛毯、湿被褥勇敢地冲出去STAR索引的优点 我们随机向里面插入了10000000条记录,其中有五条:id,name,age,addr,image 2000001,陈诗华,20,广西,帅 4000002,李佳,20,北京,帅 6000003,刘伟杰,20,天津,帅 8000004,周文兵,20,上海,帅 10000005,孔敢,20,深圳,帅 下面我们将给大家演示一下如何利用索引从数据库中快速找到这几条数据!火灾袭来时要迅速疏散逃生,不可蜂拥而出或留恋财物,要当机立断,披上浸湿的衣服或裹上湿毛毯、湿被褥勇敢地冲出去STAR索引的类型一:逻辑分类索引可分普通索引,唯一索引,主键索引和组合索引。
21、(1)普通索引CREATE INDEX indexName ON user(name(length);如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length,下同。(2)唯一索引CREATE UNIQUE INDEX indexName ON user(username(length)唯一索引是不允许其中任何两行具有相同索引值的索引。当现有数据中存在重复的键值时,大多数数据库不允许将新创建的唯一索引与表一起保存。数据库还可能防止添加将在表中创建重复键值的新数据。例如,如果在employee表中职员的姓(lname)上创建了唯一
22、索引,则任何两个员工都不能同姓。火灾袭来时要迅速疏散逃生,不可蜂拥而出或留恋财物,要当机立断,披上浸湿的衣服或裹上湿毛毯、湿被褥勇敢地冲出去添加普通索引的效果没有添加索引的用时为name添加普通索引后查询的用时火灾袭来时要迅速疏散逃生,不可蜂拥而出或留恋财物,要当机立断,披上浸湿的衣服或裹上湿毛毯、湿被褥勇敢地冲出去STAR索引的类型(3)主键索引:它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引:CREATE TABLE user(id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50)NOT NULL,age INT,ad
23、dr VARCHAR(200),image MEDIUMBLOB(2000);火灾袭来时要迅速疏散逃生,不可蜂拥而出或留恋财物,要当机立断,披上浸湿的衣服或裹上湿毛毯、湿被褥勇敢地冲出去主键索引数据库表经常有一列或列组合,其值唯一标识表中的每一行。该列称为表的主键。在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。该索引要求主键中的每个值都唯一。当在查询中使用主键索引时,它还允许对数据的快速访问。火灾袭来时要迅速疏散逃生,不可蜂拥而出或留恋财物,要当机立断,披上浸湿的衣服或裹上湿毛毯、湿被褥勇敢地冲出去STAR索引的类型(4)组合索引:下面给大家演示对比一下单列索引
24、和组合索引 就是将 name,age,addr建到一个索引里:ALTER TABLE user ADD INDEX name_age_addr(name(10),age,addr);建表时,name长度为 50,这里用 10。这是因为一般情况下名字的长度不会超过10,这样会加速索引查询速度,还会减少索引文件的大小,提高INSERT的更新速度。建立这样的组合索引,其实是相当于分别建立了下面三组组合索引:name,age,addr name,age name 火灾袭来时要迅速疏散逃生,不可蜂拥而出或留恋财物,要当机立断,披上浸湿的衣服或裹上湿毛毯、湿被褥勇敢地冲出去STAR索引的类型 建立组合索引
25、,能进一步榨取MySQL的效率。为什么没有 age,addr这样的组合索引呢?这是因为MySQL组合索引“最左前缀”的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这三列的查询都会用到该组合索引,下面的几个SQL就会用到这个组合索引:SELECT*FROM user WHREE name=李佳 AND addr=深圳 SELECT*FROM user WHREE name=李佳 而下面几个则不会用到:SELECT*FROM user WHREE age=20 AND city=广西 SELECT*FROM user WHREE city=深圳 火灾袭来时要迅速疏散逃生,不可蜂拥而出或
26、留恋财物,要当机立断,披上浸湿的衣服或裹上湿毛毯、湿被褥勇敢地冲出去STAR建立索引的时机到这里我们已经学会了建立索引,那么我们需要在什么情况下建立索引呢?一般来说,在WHERE和JOIN中经常出现的列(字段)需要建立索引,但也不完全如此,因为MySQL只对,=,BETWEEN,IN,以及某些时候的LIKE才会使用索引。例如:SELECT u.name FROM user u LEFT JOIN dept d ON u.name=d.name WHERE u.age=20 AND u.addr=广西 此时就需要对age和addr建立索引,由于dept表的name也出现在了JOIN子句中,也有对
27、它建立索引的必要。火灾袭来时要迅速疏散逃生,不可蜂拥而出或留恋财物,要当机立断,披上浸湿的衣服或裹上湿毛毯、湿被褥勇敢地冲出去STAR索引的建立一般来说,应该在这些列上创建索引:在经常需要搜索的列上,可以加快搜索的速度;在作为主键的列上,强制该列的唯一性;在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。火灾袭来时要迅速疏散逃生,不可蜂拥而出
28、或留恋财物,要当机立断,披上浸湿的衣服或裹上湿毛毯、湿被褥勇敢地冲出去同样,对于有些列不应该创建索引。一般来说,不应该创建索引的的这些列具有下列特点:第一,对于那些在查询中很少使用的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。第二,对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。第三,对于那些定义为text,im
29、age和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。第四,当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。火灾袭来时要迅速疏散逃生,不可蜂拥而出或留恋财物,要当机立断,披上浸湿的衣服或裹上湿毛毯、湿被褥勇敢地冲出去索引的优点创建索引可以大大提高系统的性能。第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。第二,可以大大加快数据的检索速度,这也是创建索引的最主
30、要的原因。第三,可以加速表和表之间的连接。第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。火灾袭来时要迅速疏散逃生,不可蜂拥而出或留恋财物,要当机立断,披上浸湿的衣服或裹上湿毛毯、湿被褥勇敢地冲出去索引的缺点增加索引也有许多不利的方面。第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的
31、维护,这样就降低了数据的维护速度。火灾袭来时要迅速疏散逃生,不可蜂拥而出或留恋财物,要当机立断,披上浸湿的衣服或裹上湿毛毯、湿被褥勇敢地冲出去STAR使用索引的注意事项1.索引不会包含有NULL值的列:只要列中包含有NULL值都将不会被包含在索引中,组合索引中只要有一列含有NULL值,那么这一列对于此组合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。2.使用短索引:对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的列,如果在前10个或20个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I
32、/O操作。火灾袭来时要迅速疏散逃生,不可蜂拥而出或留恋财物,要当机立断,披上浸湿的衣服或裹上湿毛毯、湿被褥勇敢地冲出去STAR使用索引的注意事项3.索引列排序:MySQL查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创组合索引。4.like语句操作:一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like“%aaa%”不会使用索引而like“aaa%”可以使用索引。火灾袭来时要迅速疏散逃生,不可蜂拥而出或留恋财物,要当机立断,披上浸湿的衣服或裹上湿毛毯、湿被褥勇敢地冲出去STAR使用索引的注意事项5.不要在列上进行运算:SELECT*FROM user WHERE YEAR(addDate)2007;将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成SELECT*FROM user WHERE addDate2007-01-01;36By 马龙-代码帅,运行快