MySQL性能优化(三)-- 索引
一、什么是索引及索引的特点
索引是一种数据结构
索引的特点:查找速度快,排好序,数据结构
索引的数据结构类型有:BTREE索引和HASH索引,下面展示的是BTREE索引。
BTREE:balance tree (平衡树)
BTREE的特点实例:
假设有一张表,表中的数据为下图中的左侧,则索引中数据为下图中的右侧:
  
如果查询id为9,name为ii的,在表中需要查询9次,但是在二叉树中需要查询次。
二、索引的“类型”
1.聚集索引:节点就是数据本身,即索引表中存的就是数据本身
2.非聚集索引:节点仍然是索引节点,只不过有指向对应数据块的指针,上面所说的BTREE索引就是非聚集索引
聚集索引的速度比非聚集索引快。
三、索引的类型
1.单列索引(一个索引只包含一个列,一个表可以有多个单列索引)
1-1.主键索引:primary key
创建主键索引,有两种方式,其中t1和t2位表名,id为列:
(1)建表的时候创建:create table t1 (id int primary key);
(2)通过alter语句:alter table t2 add primary key(id);
1-2.普通索引:index,最基本的索引
创建普通索引:
(1)create index 索引名 on 表(列),
例如: create index idx_id on t3(id);
(2)通过alter语句:alter table t4 add index(id);
1-3.唯一索引:unique
创建唯一索引:
(1)建表的时候创建:create table t5 (id int unique);
(2)create unique index 索引名 on 表(列),
例如:create unique index idx_id on t5(id);
注意:unique的字段可以为null,也可以重复,“”不可以重复出现。
1-4.全文索引:fulltext
数据库自带的全文索引,对中文支持不友好,可以借助第三方的框架,如:sphinx(斯芬克斯)、coreseek
2.多列索引(组合索引,一个组合索引包含两个或两个以上的列)
创建:create index idx_列名1_列名2 on 表名(列名1,列名2)
实例:
建表:create table student(id int,name varchar(20),address varchar(20),remark varchar(20));
建组合索引:create index idx_name_address_remark on student(name,address,remark);
查询sql是否使用到了索引,可以使用explain进行分析,explain详解见:http://www.cnblogs.com/xbq8080/p/6575413.html
在使用查询的时候遵循mysql组合索引的“最左前缀”,where时的条件要按建立索引的时候字段的排序方式,下面都是基于多列索引讲述的:
1、不按索引最左列开始查询
(1) where address='深圳' 不会走索引
     
(2)where address = '深圳' and remark='程序员' 不会走索引
    
2、查询中某个列有范围查询,则其右边的所有列都无法使用查询(多列查询)
where name='xbq' and address like '%深%' and remark='程序员' ,该查询只会使用索引中的前两列,因为like是范围查询

3、查询中第一个索引字段出现like '%xxx%'或者'%xxx',不会走索引
      
4.查询中多条件用or连接,此类型和1相似
    
那么对于索引怎么删除呢?删除索引:alter table 表名 drop index 索引名称
查询索引有两种方式:
1.show index from t1;
2.show keys from t1;
四、索引的优点和缺点
优点:1.可以通过建立唯一索引或者主键索引,保证数据库表中每一行数据的唯一性.
2.提高检索速度,降低磁盘读取IO
索引是排序好的,不需要进行全表扫描,降低了数据排序的运算成本,也就是降低了CPU的消耗
缺点:1.索引也需要存储,所以也需要空间,实际上索引也是一张表,保存了索引字段的值和指向实体表的指针
2.降低更新(增删改)表的速度,更新不仅仅只是数据本身,如果数据正好是索引字段,同时需要更新索引信息
当索引字段对应的数据改变了,则索引表也会改变,例如,当图书馆中 的书柜和书,书的类型为科普类,书柜上的目录也是科普类,
当此书柜中的书改变了位置的时候,则对应的书柜的目录表也要改变。
五、数据库哪些情况下适合建索引,哪些情况下不适合建索引
见:http://www.cnblogs.com/xbq8080/p/6589837.html
MySQL性能优化(三)-- 索引的更多相关文章
- MySQL性能优化(三):索引
		
原文:MySQL性能优化(三):索引 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/vbi ...
 - MySQL性能优化:索引
		
MySQL性能优化:索引 索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序.数据库使用索引以找到特定值,然后顺指针找到包含该值的行.这样可以使对应于表的SQL语句执 ...
 - Mysql性能优化三(分表、增量备份、还原)
		
接上篇Mysql性能优化二 对表进行水平划分 如果一个表的记录数太多了,比如上千万条,而且需要经常检索,那么我们就有必要化整为零了.如果我拆成100个表,那么每个表只有10万条记录.当然这需要数据在逻 ...
 - mysql性能优化之索引优化
		
作为免费又高效的数据库,mysql基本是首选.良好的安全连接,自带查询解析.sql语句优化,使用读写锁(细化到行).事物隔离和多版本并发控制提高并发,完备的事务日志记录,强大的存储引擎提供高效查询(表 ...
 - MySQL性能优化之索引设计
		
作者:IT王小二 博客:https://itwxe.com 上一篇给小伙伴们讲了关于SQL查询性能优化的相关技巧,一个好的查询SQL离不开合理的索引设计.这篇小二就来唠一唠怎么合理的设计一个索引来优化 ...
 - Mysql性能优化三:主从配置,读写分离
		
大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器扛,如此多的数据库连接操作,数据库必然会崩溃,数据丢 ...
 - MySQL 数据库性能优化之索引优化
		
接着上一篇 MySQL 数据库性能优化之表结构,这是 MySQL数据库性能优化专题 系列的第三篇文章:MySQL 数据库性能优化之索引优化 大家都知道索引对于数据访问的性能有非常关键的作用,都知道索引 ...
 - mysql性能优化-慢查询分析、优化索引和配置 (慢查询日志,explain,profile)
		
mysql性能优化-慢查询分析.优化索引和配置 (慢查询日志,explain,profile) 一.优化概述 二.查询与索引优化分析 1性能瓶颈定位 Show命令 慢查询日志 explain分析查询 ...
 - [MySQL性能优化系列]巧用索引
		
1. 普通青年的索引使用方式 假设我们有一个用户表 tb_user,内容如下: name age sex jack 22 男 rose 21 女 tom 20 男 ... ... ... 执行SQL语 ...
 - MySQL性能优化 - 别再只会说加索引了
		
MySQL性能优化 MySQL性能优化我们可以从以下四个维度考虑:硬件升级.系统配置.表结构设计.SQL语句和索引. 从成本上来说:硬件升级>系统配置>表结构设计>SQL语句及索引, ...
 
随机推荐
- JDBC事务和JTA (XA)事务区别
			
JDBC 事务 JDBC 事务是用 Connection 对象控制的.JDBC Connection 接口( java.sql.Connection )提供了两种事务模式:自动提交和手工提交. 在jd ...
 - IWDG—独立看门狗
			
本章参考资料:<STM32F4XX 中文参考手册> IWDG 章节.学习本章时,配合<STM32F4XX 中文参考手册> IWDG 章节一起阅读,效果会更佳,特别是涉及到寄存器 ...
 - JavaScript高级 面向对象(5)--内存逻辑图画法
			
说明(2017.3.30): 1. 使用软件diagram designer,DiagramDesignerSetup1.28.zip,很小只有1M多,我用的自带画图软件.教学视频是“JavaScri ...
 - 服务器响应慢的分析与解决(Linux服务器)
			
一.分析思路 1.排除本机自身原因 2.服务器性能分析 3.项目本身分析(不详细说) 4.虚拟机分析 5.数据库分析 二.详细分析方法 1.排除本机自身原因 可以使用站长工具测试网站速度. 2.服务器 ...
 - SQL数据库,如何把服务器中的一张表插入到另外一个服务器的一张表中
			
先开启 exec sp_configure 'show advanced options',1 reconfigure exec sp_configure 'Ad Hoc Distributed Qu ...
 - 【C#/WPF】调节图像的HSL(色相Hue、饱和度Saturation、明亮度Lightness)
			
先说概念: HSL是一种描述颜色的方式,其他颜色描述方式还有大家熟悉的RGB值.HSL三个字母分别表示图像的Hue色相.Saturation饱和度.Lightness明亮度. 需求: 制作一个面板,包 ...
 - C++报错集锦
			
(一)invalid initialization of non-const reference of type 'float&' from a temporary of type 'floa ...
 - [Django学习]上传图片
			
上传图片 当Django在处理文件上传的时候,文件数据被保存在request.FILES FILES中的每个键为<input type="file" name="& ...
 - Web API(五):Web API跨域问题
			
一.什么是跨域问题 跨域:指的是浏览器不能执行其他网站的脚本.是由浏览器的同源策略造成的,是浏览器施加的安全限制.(服务端可以正常接收浏览器发生的请求,也可以正常返回,但是由于浏览器的安全策略,浏览器 ...
 - Entity Framework实体拆分
			
一.概念 实体拆分:一个实体拆分成多个表,如Product实体,可以拆分成Product和ProductWebInfo两个表,Product表用于存储商品的字符类信息,ProductWebInfo用于 ...