mysql中的索引就是用来加速表的查询 更新速度,mysql的每个表都对应三个文件 一个用来放数据 一个用来放表结构,还有一个就是用来放索引的,看来索引的作用很大,索引是建在列上的,我们平时可能不会注意到,因为数据量的关系不接触到百万级的数据,数据库的操作我们是感觉不到他的速度的,还有平时用的主键 ,where查询看似都像一种索引,但真正的索引是什么,他建在那里,在那里起作用那?像select * from where name="ceshi1" 就where后面跟的列名我做了测试4万条记录,没有建索引的时候用来0.035s 建立索引create index indexname on php (name)后用来0.001s,效果明显啊,索引是一个条件,索引的分类有b-tree索引 hash索引 fulltext全文索引 r-tree索引
b-tree索引是最常用的索引:所有存储引擎都支持的,他的物理文件大多是以平衡二叉树的形式存储的,数据都存放在left node上面,到任何一个节点的路径长度都是相同的,在innodb存储引擎中存在着两种索引,一种是主键形式的索引,另一种就是b-tree索引了,不同的是主键索引在left nodes中存放了实际数据包括主键字段和其他字段整个数据以主键进行排列,而b-tree索引与其他的一样,多的就是还存放了innodb的主键值,所以在innodb中用主键访问的效率是最高的,在innodb中有主键就按主键索引,有一般的就按一般的索引没有就有个默认的索引,默认的索引速度也是相当快的,比一般的索引都要快,
HASh 索引
只有memory支持此种索引,他的实现是将键值进行hash算法存入到hash表中,在每次检索的时候,都会将检索条件进行相同的算法,在和hash表中的值进行对比得到相应的信息,hash索引的效率非常高可以一次检索到位,但是有很多弊端,他不能使用范围条件进行查询,像 > < between != like 'pattern' (pattern不可以用通配符开始 可以结束),只能使用 = in <=>来进行查询,无法被利用来避免数据的排序操作,在组合索引()中不能使用前面的几个索引进行查询,
FULL-TEXT全文索引
目前仅在myisam引擎中支持,只有char varchar text 这三种数据类型支持,主要用来替代效率低的like'%...%'操作的,在存储内容中索引被分为两部分,一部分是分割前的索引字符串数据集合,另一部分是分割后的词的索引信息,
R-TREE 索引
主要是用来解决空间数据检索的问题,只有一种数据类型geometry支持这种索引,
索引的制定:如何选择索引?
知道了都有什么索引,大概用在那些方面后,我们可以发现我们主要用的就是b-tree索引,我们都知道索引可以提高数据的查询效率,还有就是降低数据的排序成本,因为索引字段在使用索引的时候就把键值排序存放,当时有该字段排序的时候就不同操作而是直接使用排序好的结果,快吧,但不合理的索引设计也起不到任何作用反而为降低速度,应为索引本身也要占用一定的资源。那该如何选择索引那,具体情况很复杂,没有统一的标准,但可以遵循下面几条:
较频繁的作为查询条件的字段应该创建索引,
唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件,像性别 角色什么的,或是返回全表的15%以下的数据的
跟新非常频繁的字段不适合创建索引,因为更新操作还要更新索引的键值,
不会出现在where子句中的字段不适合建索引,
组合索引还是单键索引:
通常在where后面的字段并不是单一字段,经常会有多个字段在一起作为查询条件的,这就要考虑是只为过滤性较好的字段建立索引还是建立组合索引,还有就是我们可能会想到创建多个单键索引来替代组合索引但这种想法往往事与愿违的,为什么那,因为在使用的时候他只好使用其中一个索引,索引应该建立组合索引尤其是在并发量较大的应用中,但不是把所有的查询字段都建到一个组合索引中,应该让一个组合索引尽量为多个query语句使用,尽量减少同一个表上的索引数量,
不合理的索引是设计
在有很多重复的列上建立索引,数据在物理上随机存放在数据页上,在范围查找时,必须执行一次表扫描才能找到这一范围,这样会频繁的返回已经查找过的表,
组合索引前导的问题,例如 a, b, c, d 有四个字段组成的组合索引,但在query的时候,排在首位的子句不是a 则索引将其不到作用,后面在应用c的时候还有索引覆盖他的速度就比较快了,如果把前导选择好可以提高索引效率,后面的覆盖索引也可以提高索引的效率,
一般来说有大量重复值且经常有范围查询的(between > < >= order by, group by可以考虑建立组合索引,组合索引尽量是关键查询形成的索引覆盖,其前导列一定是使用最频繁的列,
不可优化的where子句
如果在where子句中出现 substirng(name ,1,4)/nnu/20<1000 /="***"
的时候速度为变的很慢,因为where子句中对列的任何操作结果都在sql运行时逐列的计算得到,因此他不的不进行全表搜索,而没有使用该列上面的索引,可以使用下面代替 like '**%' <1000*30 /=
还有就是在where条件中使用in in ('0','1'),语法分析器会将in转换为 0 or 1 来执行,我们期望他会根据每个or子句分别查找,在将结果相加,这样可以利用前面建立的索引,但实际上他却采用了or的策略,及先取出满足每个or子句的行,存入数据库的工作表中,在建立唯一索引以去掉重复的行,最后从这个临时表中计算结果,因此实际过程中他没有用到建立在列上的索引,可以利用存储过程,或是拆开来处理这中事情,
create proc count as
declare a int b int c int d char(10)
begin
select a = count(*) from tablename id = '0'
select b = count(*) from talbename id = '1'
end
select c = a + b
select d = convert (char(10),c)
prind d
分享到:
相关推荐
针对索引优化,有一些规则可遵循: 1. 模糊查询优化:前导模糊查询(如`'%XX'`)无法使用索引,而非前导模糊查询(如`'XX%'`)可以。避免在查询中使用左模糊或全模糊,如果需要,可以考虑使用全文搜索引擎。 2. `...
Mysql的索引及优化策略,个人感觉还不错
### MySQL的索引优化 #### 一、索引的基本概念 索引是在数据库表中用于提高数据检索效率的重要工具。简单来说,索引就像是图书的目录页,可以帮助用户快速定位到所需的信息,而无需逐页查找。对于MySQL而言,所有...
MySQL索引优化是数据库性能提升的关键环节,本篇主要探讨了几个关于MySQL索引使用和优化的重要知识点。 首先,创建了一个名为`employees`的员工记录表,其中包含`id`(主键)、`name`、`age`、`position`和`hire_...
MySQL索引优化是数据库性能提升的关键技术之一,尤其在处理大量数据时,高效索引能够显著加快查询速度,降低服务器负载。本课件主要聚焦于MySQL数据库的索引原理、优化策略以及相关存储过程和触发器的应用。 首先,...
"MySQL索引分析及优化" 索引是数据库中提高速度的一个关键因素。如果作为搜索条件的列上已经创建了索引,MySQL无需扫描任何记录即可迅速得到目标记录所在的位置。索引的使用可以大幅度地提高查询速度,减少数据库的...
MySQL索引原理及慢查询优化是数据库管理中的重要主题,尤其是在高并发、大数据量的互联网环境中,优化查询性能对于系统的整体效能至关重要。MySQL作为广泛使用的开源关系型数据库,其索引机制和查询优化技巧是开发者...
关于mysql索引一些优化介绍与创建原则,还有对order by排序的算法的介绍等等
一、MySQL索引 1. 索引类型:MySQL支持多种索引类型,包括B-Tree(默认索引类型)、Hash、Full-text(全文索引)以及R-tree(空间数据索引)。B-Tree索引适用于范围查询,而Hash索引适用于等值查询,Full-text索引...
### MySQL索引分析和优化 #### 一、索引的重要性及原理 索引在数据库管理中扮演着极其重要的角色,特别是在提高数据检索速度方面。**MySQL索引**本质上是用来加快数据检索过程的一种数据结构,类似于书籍中的目录...
MySQL查询优化技术_索引
MySQL索引 聚集索引 如果你想了解MySQL索引查询优化,你首先应该对MySQL数据组织结构、B-Tree索引、聚集索引,次要索引有一定的了解,才能够更好地理解MySQL查询优化行为。这里主要探讨MySQL InnoDB的聚集索引。
mysql索引的优化方案技术分享,珍贵资料收藏下
Mysql索引优化案例 在对数据库进行操作时,尤其是在处理包含大量数据的表时,查询的性能问题是一个常见且重要的话题。在实际工作中,对于Mysql数据库进行索引优化是提高查询效率、减少查询时间的重要手段。本案例将...
在一些情况下,MySQL可以使用索引优化DISTINCT操作,但需要活学活用.本文涉及一个不能利用索引完成DISTINCT操作的实例. 实例1 使用索引优化DISTINCT操作 create table m11 (a int, b int, c int, d int, primary ...
8. **索引优化**:MySQL提供了`EXPLAIN`关键字,可以帮助分析查询执行计划,了解是否正确使用了索引。通过`EXPLAIN`,可以发现查询是否进行了全表扫描、是否使用了索引、索引的类型以及索引的覆盖程度等信息,从而...
由浅入深探究mysql索引结构原理、性能分析与优化
mysql索引优化思维导图
### MySQL的or、in、union与索引优化 在数据库查询优化中,索引的使用至关重要,它能显著提升查询速度。本文将基于一个具体的业务场景来探讨在MySQL中使用`union all`、`in`、`or`以及负向查询(如`!=`)时如何有效...