索引和查询优化

索引和查询优化

添加索引的三种方法

一、Alter table 表名 add 键类型 (列列表)

键类型:primary key/unique key/fulltext index/index(普通索引可以在index后接索引名)

二、建表时在列名 类型 后加索引类型

三、建表时在所有列名后面加索引类型(列列表)

(全文索引是为了解决like%这种效率低的查询方式提出的查询优化)

索引的原理

索引的存在就是为了加快查询速度的。每个行记录按照主键大小顺序排列在一个页中,形成一个单链表,每个页都有一个页面目录,页面目录把记录分成多组记录每组的末尾地址,这样在页中查找记录时就可以采用二分法的方式。页与页之间按照主键顺序形成一个双向链表,非叶子节点的页每条记录是页编号和页最小主键值,同一层次的页也按照主键排列形成双向链表,这就是一颗B+树,也就是主键索引生成的树称为聚簇索引,叶子节点记录着完整的信息。如果表中有个列叫score,想按照分数建立索引就会生成一颗二级索引,记录按照分数大小排列,树叶子节点记录分数值、主键值,非页节点记录分数、主键、页号,查询时先根据分数的范围查到主键值,然后根据主键值回表去聚簇索引查完整的记录。Innodb索引就是这样的,二级索引都需要回表,完整的记录在聚簇索引中,而myISAM索引不是,myISAM数据都存在一个文件里,按照插入顺序排列,索引另外存在其他文件,主键索引文件叶子节点保存的是数据的主键值和行号,然后根据行号再去数据文件里寻找对应的记录,相当于所有的索引都需要回表,所有的索引都是二级索引。

使用索引的技巧

1、命中索引:全值匹配(可以不按顺序)、最左前缀(把能过滤重复值较多的放在前面)、前缀匹配、不将列放入函数中、不带表达式

2、自动生成主键索引和唯一键索引:按它们查效率高

3、在二级索引中查到主键值是顺序IO,回表是随机IO,效率低,尽量降低回表数,或者干脆查二级索引叶子节点的信息(覆盖索引),这样就不用回表了。增加限制条件如limit限制回表数否则索引会失效,查询优化器会用全表扫描。

4、列的类型尽量选择小的,尤其是主键和索引列,内存中会存多份

5、避免重复索引和冗余索引。重复索引是有主键或唯一键索引又重复建立或建立两次索引,冗余索引是建立了联合索引没有必要建立联合索引的最左部分的索引。

(索引不是越多越好,索引增加会降低update、delete和insert的效率)

查询优化

单表查询的几种级别:const(主键或唯一键等值条件)、ref(普通索引等值条件)、ref-or-null、range(索引范围搜索)、index(覆盖索引)、all(全表扫描)

用explain来查看查询执行的方法,单表查询的方法不能是all,至少要优化到range。

1、命中索引

2、判断条件不加null,因为null值是不受限制的,不会用二分法加速查询过程,导致放弃索引(这个观点是错的,where中主键加null是自动优化为false的,非主键加null条件会自动搜索列中最小的位置寻找null)

3、慎用一些低效的符号,or,in,not in

4、用exists子查询代替in子查询可能命中索引

优化手段是因地制宜的,自动选择查询方案是mysql的特性,不同的情况很多定律也不那么适用。

Limit a b分页语句的执行速度很慢,原因在于它是读a+b个数据,然后取最后b个这样的查找方式,改进方法有以下几个:

1、加order by id limit a,b 利用索引,id也可以换成其他索引

2、先找到第一个数据然后用where条件筛选末尾跟limit b,这样只读b条数据

3、尽量使用覆盖索引,只查二级索引的内容,不回表

原文地址:https://www.cnblogs.com/shizhuoping/p/11562048.html

时间: 2024-10-10 21:24:15

索引和查询优化的相关文章

2???? 索引及查询优化

2     索引及查询优化 索引的类型 ? 普通索引:这是最基本的索引类型,没唯一性之类的限制. ? 唯一性索引:和普通索引基本相同,但所有的索引列值保持唯一性. ? 主键:主键是一种唯一索引,但必须指定为"PRIMARY KEY". ? 全文索引:MYSQL从3.23.23开始支持全文索引和全文检索.在MYSQL中,全文索引的索引类型为FULLTEXT.全文索引可以在VARCHAR或者TEXT类型的列上创建. 大多数MySQL索引(PRIMARY KEY.UNIQUE.INDEX和F

mysql 索引和查询优化

对于任何DBMS,索引都是进行优化的最主要的因素.对于少量的数据,没有合适的索引影响不是很大,但是,当随着数据量的增加,性能会急剧下降.如果对多列进行索引(组合索引),列的顺序非常重要,MySQL仅能对索引最左边的前缀进行有效的查找. 例如:假 设存在组合索引it1c1c2(c1,c2),查询语句select * from t1 where c1=1 and c2=2能够使用该索引.查询语句select * from t1 where c1=1也能够使用该索引.但是,查询语句select * f

MySQL索引及查询优化总结

作者 | 谢庆玲 文章<MySQL查询分析>讲述了使用MySQL慢查询和explain命令来定位mysql性能瓶颈的方法,定位出性能瓶颈的sql语句后,则需要对低效的sql语句进行优化.本文主要讨论MySQL索引原理及常用的sql查询优化. 一个简单的对比测试 前面的案例中,c2c_zwdb.t_file_count表只有一个自增id,FFileName字段未加索引的sql执行情况如下: 在上图中,type=all,key=null,rows=33777.该sql未使用索引,是一个效率非常低的

sqlserver索引与查询优化

此文为转载,仅做保存使用,出处:http://www.cr173.com/html/8688_all.html 在数据库存优化设计中往往会提到索引,这编文章就来详细的说明一下在 SQL SERVER 下面的建立索引的技巧和需要注意的一些地方,让您可以更直观的了解数据库的结构. 往往在数据量比较小,查询量也不是很大的时候我们往往会忽视索引的存在. 总结优化如下: 1.主键就是聚集索引 2.只要建立索引就能显著提高查询速度 3.把所有需要提高查询速度的字段都加进聚集索引,以提高查询速度 (四)其他书

MySQL索引和查询优化

对于任何DBMS,索引都是进行优化的最主要的因素.对于少量的数据,没有合适的索引影响不是很大,但是,当随着数据量的增加,性能会急剧下降.如果对多列进行索引(组合索引),列的顺序非常重要,MySQL仅能对索引最左边的前缀进行有效的查找. 例如:假 设存在组合索引it1c1c2(c1,c2),查询语句select * from t1 where c1=1 and c2=2能够使用该索引.查询语句select * from t1 where c1=1也能够使用该索引.但是,查询语句select * f

索引及查询优化

索引的类型 : Ø 普通索引 这是最基本的索引类型,没唯一性之类的限制. Ø 唯一性索引 和普通索引基本相同,但所有的索引列值保持唯一性. Ø 主键索引 主键是一种唯一索引,但必须指定为”PRIMARY KEY”. Ø 全文索引 MYSQL从3.23.23开始支持全文索引和全文检索.在MYSQL中,全文索引的索引类型为FULLTEXT.全文索引可以在VARCHAR或者TEXT类型的列上创建. 大多数MySQL索引(PRIMARY KEY.UNIQUE.INDEX和FULLTEXT)使用B树中存储

【转】MySQL索引和查询优化

原文链接:http://www.cnblogs.com/mailingfeng/archive/2012/09/26/2704344.html 对于任何DBMS,索引都是进行优化的最主要的因素.对于少量的数据,没有合适的索引影响不是很大,但是,当随着数据量的增加,性能会急剧下降.如果对多列进行索引(组合索引),列的顺序非常重要,MySQL仅能对索引最左边的前缀进行有效的查找. 例如:假 设存在组合索引it1c1c2(c1,c2),查询语句select * from t1 where c1=1 a

MySQL的索引优化,查询优化

MySQL逻辑架构 如果能在头脑中构建一幅MySQL各组件之间如何协同工作的架构图,有助于深入理解MySQL服务器.下图展示了MySQL的逻辑架构图. MySQL逻辑架构,来自:高性能MySQL MySQL逻辑架构整体分为三层,最上层为客户端层,并非MySQL所独有,诸如:连接处理.授权认证.安全等功能均在这一层处理. MySQL大多数核心服务均在中间这一层,包括查询解析.分析.优化.缓存.内置函数(比如:时间.数学.加密等函数).所有的跨存储引擎的功能也在这一层实现:存储过程.触发器.视图等.

MySQL拓展 视图,触发器,事务,存储过程,内置函数,流程控制,索引,慢查询优化

视图: 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么要用视图 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何使用视图 create view teacher2course as select * from teacher inner join course on teacher.tid = course.teacher_id; 强调: (1)在硬盘中,视图只有表结构文件,没有表结构数据 (2)视图通常是用于查询,尽量不要修改视图中的数据 dro