来了解一下Mysql索引的相关知识:基础概念、性能影响、索引类型、创建原则、注意事项
索引的基础概念
索引类似于书籍的目录,要想找到一本书的某个特定主题,需要先查找书的目录,定位对应的页码;存储引擎使用类似的方式进行数据查询,先去索引当中找到对应的值,然后根据匹配的索引找到对应的数据行
索引对性能的影响
大大减少服务器需要扫描的数据量、帮助服务器避免排序和临时表、将随机I/O变成顺序I/O、大大提高查询速度,读写降低写的速度(读写操作会操作索引)并且占用磁盘开销(索引也是数据)
索引的类型
普通索引:最基本的索引,没有任何约束限制
唯一索引:与普通索引类似,但是具有唯一性索引
主键索引:特殊的唯一索引,不允许有空值
唯一索引和主键索引的区别:一个表只能有一个主键索引,可以有多个唯一索引。主键索引一定是唯一索引,唯一索引不是主键索引。主键可以与外键构成参照完整性约束,防止数据不一致
组合索引:将多个列组合在一起创建索引,可以覆盖多个列。(比如查询某本书的第几个小节,那么需要创建章和节的索引)
外键索引:只有InnoDB类型的表才可以使用外键索引,保证数据的一致性、完整性和实现级联操作。
全文索引:Mysql自带的全文索引只用于MyIsam,并且只能对英文全文检测
Mysql索引的创建原则
1:最适合索引的列是出现在WHERE子句中的列,或连接子句中的列而不是出现在SELECT关键字后的列(比如创建索引的时候,列是WHERE后的列,或者ON后的列)
2:索引列的基数越大,效果越好
3:对字符串进行索引,应该制定一个前缀长度,可以节省大量的索引空间,不然开销很大的空间
4:根据情况创建复合索引,复合索引可以提高查询效率
5:避免过多创建多音,索引会额外占用磁盘空间,降低写操作效率
6:主键尽可能选择较短的数据类型,可以有效的减少索引的磁盘占用提高查询效率
Mysql索引的注意事项
1:复合索引遵循前缀原则
KEY(a,b,c),一个索引作用在abc三个字段上,比如书来说,章/节/段/
有效的查询:/WEHRE a = 1 AND b = 2 AND c = 3/WHERE a = 1 AND b = 2 /WHERE a = 1
无效的查询:/WHERE b = 2 AND c = 3/WHERE a = 1 AND c = 3
原因:跳过a了,跳过了b,没有遵循前缀原则
2:LIKE查询,%不能在前,可以使用全文检索解决
如:WHERE name LIKE '%wang%',即使创建了索引也会失效。
3:column is null 可以使用索引
4:如果Mysql估计使用索引比全表扫描要慢,Mysql会放弃索引的使用
如:表里有100条数据,语句为 WHERE id > 1 AND id <100,即使对id创建了索引,搜索的时候需要搜2~99的数据,搜索的时候回找id为2这条数据,先去索引看一下,找到位置,再去看数据行,再去看3,去看索引,再去看数据行....这样多了一个查询索引的步骤。但Mysql认为本身就100条, 你要查询98条数据,这样查就很慢了,我直接把100条扫一下直接返回了,比用索引快多了,自动放弃索引,因为Mysql本身具备优化器
5:如果or前的条件中列有索引,后面的没有,索引都不会被用到
如:WHERE a OR b ,a里有索引,b里没有,那么索引就会失效了
6:列类型是字符串类型,查询时一定要给值加引号,否则索引失效
如:WHERE name = 'wangteng',加引号才有效;再比如有时候字符串的列里有数字类型的字符,习惯性数字略掉引号,那么这样会失效
来了解一下Mysql索引的相关知识:基础概念、性能影响、索引类型、创建原则、注意事项的更多相关文章
- Linux相关知识基础
目录 前言 第一章 Linux远程连接管理 1. 为什么要远程连接Linux系统 2. 连接前的小知识 2.2.1 IP地址 2.2.2 端口的概念 2.2.3 协议的概念 3. 远程连接Linux的 ...
- MySQL引擎的相关知识
MySQL数 据库引擎取决于MySQL在安装的时候是如何被编译的.要添加一个新的引擎,就必须重新编译MYSQL.在缺省情况下,MYSQL支持三个引 擎:ISAM.MYISAM和HEAP.另外两种类型I ...
- MySQL Install--MySQL安装相关知识和问题
1.mysqld和mysqld_safe之间关系 mysqld_safe是一个启动脚本,用来启动MySQL服务器并监控MySQL服务的运行情况,并在其服务出现故障宕机后重启其服务. mysql.ser ...
- html5 之 canvas 相关知识(一)概念及定义
什么是 Canvas? HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像. 画布是一个矩形区域,您可以控制其每一像素. canvas 拥有多种绘制路径.矩形.圆形.字符以 ...
- SQL Server创建复合索引时,复合索引列顺序对查询的性能影响
说说复合索引 写索引的博客太多了,一直不想动手写,有一下两个原因:一是觉得有炒剩饭的嫌疑,有兄弟曾说:索引吗,只要在查询条件上建索引就行了,真的可以这么暴力吗?二来觉得,索引是个非常大的话题,很难概括 ...
- 五、MySQL系列之高级知识(五)
本篇 主要介绍MySQL的高级知识---视图.事件.索引等相关知识: 一.视图 在学习视图时我们需要什么是视图,视图有哪些好处以及视图的相关操作: 1.1 什么是视图? 关于视图通俗来讲就是一条se ...
- mysql 索引相关知识
由where 1 =1 引发的思考 最近工作上被说了 说代码中不能用 where 1=1,当时觉得是应该可以用的,但是找不到什么理据, 而且mysql 语句优化这方面确实很薄弱 感觉自己mysql ...
- 数据库相关知识积累(sqlserver、oracle、mysql)
数据库相关知识积累(sqlserver.oracle.mysql) 1. sqlserver :断开所有连接: (还原数据库) 1.数据库 分离 2. USE master GO ALTER DAT ...
- MySQL学习总结:提问式回顾 undo log 相关知识
原文链接:MySQL学习总结:提问式回顾 undo log 相关知识 1.redo 日志支持恢复重做,那么如果是回滚事务中的操作呢,也会有什么日志支持么? 也回滚已有操作,那么就是想撤销,对应的有撤销 ...
随机推荐
- vue中什么样的数据可以是在视图中显示
1. Vue中不可以添加不存在的属性,因为不存在的属性是没有getter和setter的. <div id="app"> {{msg.a}} {{msg.b}} < ...
- dotnetcore vue+elementUI 前后端分离架二(后端篇)
前言 最近几年前后端分离架构大行其道,而且各种框架也是层出不穷.本文通过dotnetcore +vue 来介绍 前后端分离架构实战. 涉及的技术栈 服务端技术 mysql 本项目使用mysql 作为持 ...
- CSS深入理解学习笔记之line-height
1.line-height的定义 定义:两行文字基线之间的距离. 注:不同字体之间的基线是不同的. 2.line-height与行内框盒子模型 行内框盒子模型: ①内容区域(content area) ...
- crypto在web的使用
前言 crypto 在nodejs中是一个核心模块,虽然现在高等浏览器中也有了crypto全局对象(下图),它在nodejs中的使用与web端还是不同的. web端使用cryptojs 国外下载较慢, ...
- MySQL中union和order by一起使用的方法
MySQL中union和order by是可以一起使用的,但是在使用中需要注意一些小问题,下面通过例子来说明.首先看下面的t1表. 1.如果直接用如下sql语句是会报错:Incorrect usage ...
- java中的 private Logger log=Logger.getLogger(this.getClass());
this.getClass()得到什么? this 表示当前对象的引用: getClass() 是 java.lang.Object 中的方法,它返回一个对象的运行时类: this.getClass( ...
- android imageview按钮按下动画效果
private ImageView today_eat: today_eat = (ImageView) view.findViewById(R.id.today_eat); today_eat.se ...
- Activity组件安全(下)
什么是Activity劫持 简单的说就是APP正常的Activity界面被恶意攻击者替换上仿冒的恶意Activity界面进行攻击和非法用途.界面劫持攻击通常难被识别出来,其造成的后果不仅会给用户带来严 ...
- js中的深拷贝与浅拷贝
对象的深拷贝于浅拷贝 对于基本类型,浅拷贝过程就是对值的复制,这个过程会开辟出一个新的内存空间,将值复制到新的内存空间.而对于引用类型来书,浅拷贝过程就是对指针的复制,这个过程并没有开辟新的堆内存空间 ...
- spring之AspectJ基于注解 AOP编程
一.前言 使用注解代替之前在spring配置文件中配置目标类.切面类和aop配置. 二.注意 需要注意的是,需要在spring配置文件中引入如下,如果不添加,切面类中的@Aspect注解将不起作用 & ...