2019独角兽企业重金招聘Python工程师标准>>>

Mysql你应该要懂索引知识

索引作用

一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化显然是重中之重。

在数据量和访问量不大的情况下,mysql访问是非常快的,是否加索引对访问影响不大。但是当数据量和访问量剧增的时候,就会发现mysql变慢,甚至down掉,这就必须要考虑优化sql了,给数据库建立正确合理的索引,是mysql优化的一个重要手段。

索引的目的在于提高查询效率,可以类比字典,如果要查“mysql”这个单词,我们肯定需要定位到m字母,然后从下往下找到y字母,再找到剩下的sql。如果没有索引,那么你可能需要把所有单词看一遍才能找到你想要的。除了词典,生活中随处可见索引的例子,如火车站的车次表、图书的目录等。它们的原理都是一样的,通过不断的缩小想要获得数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是我们总是通过同一种查找方式来锁定数据。

   在创建索引时,需要考虑哪些列会用于 SQL 查询,然后为这些列创建一个或多个索引。事实上,索引也是一种表,保存着主键或索引字段,以及一个能将每个记录指向实际表的指针。数据库用户是看不到索引的,它们只是用来加速查询的。数据库搜索引擎使用索引来快速定位记录。INSERT 与 UPDATE 语句在拥有索引的表中执行会花费更多的时间,而SELECT 语句却会执行得更快。这是因为,在进行插入或更新时,数据库也需要插入或更新索引值。

索引的类型

UNIQUE(唯一索引):不可以出现相同的值,可以有NULL值
INDEX(普通索引):允许出现相同的索引内容
PROMARY KEY(主键索引):不允许出现相同的值
fulltext index(全文索引):可以针对值中的某个单词,但效率确实不敢恭维
组合索引:实质上是将多个字段建到一个索引里,列值的组合必须唯一

索引创建和删除

使用alter table语句创建索引(应用于表创建完毕之后再添加)

ALTER TABLE 表名 ADD 索引类型 (unique,primary key,fulltext,index)[索引名](字段名)//普通索引
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) ;

ALTER TABLE可用于创建普通索引、UNIQUE索引和PRIMARY KEY索引3种索引格式,table_name是要增加索引的表名,column_list指出对哪些列进行索引,多列时各列之间用逗号分隔。索引名index_name可选,缺省时,MySQL将根据第一个索引列赋一个名称。

使用CREATE INDEX语句对表增加索引

CREATE INDEX可用于对表增加普通索引或UNIQUE索引,可用于建表时创建索引

CREATE INDEX index_name ON table_name(username(length));
//create只能添加这两种索引;
CREATE INDEX index_name ON table_name (column_list)
CREATE UNIQUE INDEX index_name ON table_name (column_list)

如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。

或者创建表是直接指定

CREATE TABLE mytable(
id INT,
username VARCHAR(16),
city VARCHAR(16),
age INT,
INDEX indexName (username(10))-- INDEX indexName (username(10),city(10))
);

删除索引

删除索引可以使用ALTER TABLE或DROP INDEX语句来实现。DROP INDEX可以在ALTER TABLE内部作为一条语句处理,其格式如下

drop index index_name on table_name ;alter table table_name drop index index_name ;alter table table_name drop primary key ;

其中,在前面的两条语句中,都删除了table_name中的索引index_name。而在最后一条语句中,只在删除PRIMARY KEY索引中使用,因为一个表只可能有一个PRIMARY KEY索引,因此不需要指定索引名。如果没有创建PRIMARY KEY索引,但表具有一个或多个UNIQUE索引,则MySQL将删除第一个UNIQUE索引。

  如果从表中删除某列,则索引会受影响。对于多列组合的索引,如果删除其中的某列,则该列也会从索引中删除。如果删除组成索引的所有列,则整个索引将被删除。

索引的使用及注意事项

EXPLAIN可以帮助开发人员分析SQL问题,explain显示了mysql如何使用索引来处理select语句以及连接表,可以帮助选择更好的索引和写出更优化的查询语句。 使用方法,在select语句前加上Explain就可以了:

Explain select * from user where id=1;

索引缺点

1.虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT,UPDATE和DELETE。因为更新表时,mysql不仅要保存数据,还要保存一下索引文件
2.建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在要给大表上建了多种组合索引,索引文件会膨胀很宽.索引只是提高效率的一个方式,如果mysql有大数据量的表,就要花时间研究建立最优的索引,或优化查询语句。

索引使用技巧

使用索引时,有一些技巧:

1.索引不会包含有NULL的列只要列中包含有NULL值,都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此符合索引就是无效的。2.使用短索引对串列进行索引,如果可以就应该指定一个前缀长度。例如,如果有一个char(255)的列,如果在前10个或20个字符内,多数值是唯一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。3.索引列排序mysql查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作,尽量不要包含多个列的排序,如果需要最好给这些列建复合索引。4.like语句操作一般情况下不鼓励使用like操作,如果非使用不可,注意正确的使用方式。like ‘%aaa%’不会使用索引,而like ‘aaa%’可以使用索引。5.不要在列上进行运算6.不使用NOT IN 、<>、!=操作,但<,<=,=,>,>=,BETWEEN,IN是可以用到索引的7.索引要建立在经常进行select操作的字段上。这是因为,如果这些列很少用到,那么有无索引并不能明显改变查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。8.索引要建立在值比较唯一的字段上。9.对于那些定义为text、image和bit数据类型的列不应该增加索引。因为这些列的数据量要么相当大,要么取值很少。10.在where和join中出现的列需要建立索引。11.where的查询条件里有不等号(where column != …),mysql将无法使用索引。12.如果where字句的查询条件里使用了函数(如:where DAY(column)=…),mysql将无法使用索引。13.在join操作中(需要从多个数据表提取数据时),mysql只有在主键和外键的数据类型相同时才能使用索引,否则及时建立了索引也不会使用。以上内容整理来源于: http://www.yuanrengu.com/index.php/2017-01-13.html

索引方法Hash和BTree

索引方法,也可以理解为索引的存储数据结构。

Hash索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引。

可 能很多人又有疑问了,既然 Hash 索引的效率要比 B-Tree 高很多,为什么大家不都用 Hash 索引而还要使用 B-Tree 索引呢?任何事物都是有两面性的,Hash 索引也一样,虽然 Hash 索引效率高,但是 Hash 索引本身由于其特殊性也带来了很多限制和弊端,主要有以下这些。

(1)Hash 索引仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询。

由于 Hash 索引比较的是进行 Hash 运算之后的 Hash 值,所以它只能用于等值的过滤,不能用于基于范围的过滤,因为经过相应的 Hash 算法处理之后的 Hash 值的大小关系,并不能保证和Hash运算前完全一样。

(2)Hash 索引无法被用来避免数据的排序操作。

由于 Hash 索引中存放的是经过 Hash 计算之后的 Hash 值,而且Hash值的大小关系并不一定和 Hash 运算前的键值完全一样,所以数据库无法利用索引的数据来避免任何排序运算;

(3)Hash 索引不能利用部分索引键查询。

对于组合索引,Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值,而不是单独计算 Hash 值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash 索引也无法被利用。

(4)Hash 索引在任何时候都不能避免表扫描。

前面已经知道,Hash 索引是将索引键通过 Hash 运算之后,将 Hash运算结果的 Hash 值和所对应的行指针信息存放于一个 Hash 表中,由于不同索引键存在相同 Hash 值,所以即使取满足某个 Hash 键值的数据的记录条数,也无法从 Hash 索引中直接完成查询,还是要通过访问表中的实际数据进行相应的比较,并得到相应的结果。

(5)Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高。

对于选择性比较低的索引键,如果创建 Hash 索引,那么将会存在大量记录指针信息存于同一个 Hash 值相关联。这样要定位某一条记录时就会非常麻烦,会浪费多次表数据的访问,而造成整体性能低下。

转载于:https://my.oschina.net/grittan/blog/3043329

Mysql你应该要懂索引知识相关推荐

  1. MySQL索引知识总结

    对MySQL索引知识的总结笔记. 普通索引 索引是一种数据结构,主要用于性能的提高. 比如我们有一个表t_users,有4个字段: 1 2 3 4 5 6 7 create table t_users ...

  2. mysql索引别名_Mysql索引知识详谈

    1. 索引的重要性 索引之于数据表,相当于检字表于汉语字典,设想让你在没有检字表的情况下从字典中找出一个"武"字,你会多么无助,如果用检字表,我们一眼就能找出它在第509页 数据库 ...

  3. 深度解析串行并发并行,开发人员需彻底搞懂丨mysql|redis|skynet|协程|索引|读写分离|分布式锁|主从同步

    深度解析串行并发并行,开发人员需彻底搞懂 视频讲解如下,点击观看: 深度解析串行并发并行,开发人员需彻底搞懂丨mysql|redis|skynet|协程|索引|读写分离|分布式锁|主从同步丨C/C++ ...

  4. Mysql索引知识概括

    Mysql索引知识概括 索引由来 索引简介 索引分类 索引分析 索引延伸 执行计划与资源消耗 索引由来 性能下降SQL慢 .执行时间长 .等待时间长: 查询语句写的烂 索引失效 关联查询太多join( ...

  5. 不知怎么优化MySQL?先搞懂原理再说吧!

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达今日推荐:2020年7月程序员工资统计,平均14357元,又跌了,扎心个人原创100W+访问量博客:点击前往,查看更多 作者 ...

  6. mysql 搜索不等于_Mysql索引分类

    在绝大多数情况下,Mysql索引都是基于B+树的,而索引可以提高数据查询的效率.但是Mysql是如何利用B+树进行查询的呢?索引的作用只是提高查询效率吗? Mysql中的B+Tree索引 假设有一张教 ...

  7. MySQL SQL优化之覆盖索引

    内容概要 利用主索引提升SQL的查询效率是我们经常使用的一个技巧,但是有些时候MySQL给出的执行计划却完全出乎我们的意料,我们预想MySQL会通过索引扫描完成查询,但是MySQL给出的执行计划却是通 ...

  8. mysql 创建表格time类型_记一次关于 Mysql 中 text 类型和索引问题引起的慢查询的定位及优化...

    最近有用户反馈产品有些页面加载比较慢,刚好我在学习 Mysql 相关知识,所以先从 Mysql 慢查询日志开始定位: step1:通过慢查询日志定位具体 SQL 首先通过 SHOW VARIABLES ...

  9. MySQL教程——2 中级篇(索引、视图、存储过程)

    1. Linux 系统安装MySQL 1.1 下载Linux 安装包 https://dev.mysql.com/downloads/mysql/5.7.html#downloads 1.2 cent ...

最新文章

  1. Android 自定义 —— View moveTo与 rMoveTo 的区别
  2. mysql 配置执行计划_MySQL深入学习(二)--配置、索引、执行计划
  3. 毕业设计 c语言编译器的设计开发-字节代码格式设计与实现 开题报告,C语言编译器设计与实现...
  4. ubuntu libapache2-mod-php5,ubuntu安装apache2 mysql5 php5
  5. 怎样才能到国外做博士后
  6. RT-Flash imxrt 系列rt1052 rt1060量产神器宣传
  7. 有前途的人工智能大数据分析相关职业:Python数据科学入门之路
  8. smart原则_为什么现在少有人用德鲁克的SMART原则做目标管理了?
  9. linux安装光盘制作工具,(三)Linux平台多操作系统安装盘制作工具
  10. TreeView的checked事件
  11. WINDOWS下VIM配置
  12. HTML 提高页面加载速度的方法
  13. apache+php
  14. Sparklyr与Docker的推荐系统实战
  15. MPC模型预测控制器——控制器建模+MATLAB编程
  16. 数值分析期末考试复习(逼近问题)
  17. 如何使用XGBoost开发随机森林集成
  18. Python学习资源收集
  19. 批量导出word中的清晰图片
  20. html5播放器 php,PHP/HTML5页面上的随机声音播放器

热门文章

  1. php _get invalid,PHP 错误: ZipArchive::getFromName(): Invalid or unitialized Zip object in 解决方法...
  2. 当上项目经理才知道!linuxmysql执行sql文件命令
  3. java web 中的乱码
  4. java程序运行没有结果,求助啊!我刚学java 下面的程序一直运行但是没结果!!!...
  5. java制作玩游戏并支付游戏币_java 学习第三天小练习
  6. ios项目 swift 定义常量 其他文件引用_面试应该注意的Swift知识点
  7. python函数不包括参数函数_python中实现函数不限制参数的数量
  8. position有哪些属性?
  9. yum php mysql5.5_CentOS 5.5使用yum来安装LAMP(php运行环境)
  10. arp欺骗的软件有哪些_局域网内如何防止ARP欺骗