mysql索引与md5_MySQL理解索引、添加索引的原则
索引用于快速找出在某个列中有一特定值的行。不使用索引,MySQL必须从第1条记录开始然后读完整个表直到找出相关的行,还需要考虑每次读入数据页的IO开销。而如果采取索引,则可以根据索引指向的页以及记录在页中的位置,迅速地读取目标页进而获取目标记录。
大多数情况下都(默认)采用B树来构建索引。只是空间列类型的索引使用R-树,并且MEMORY表还支持hash索引。B树是平衡多叉树,每个节点存放多少个值取决于值所占的空间,这与每一张数据页存放多少条记录与记录信息量有关同理。节点中的值是以非降序进行排列的,节点中的值总是小于等于指向它的结点中的值。
MySQL使用B树构造索引的情况下,是由叶子指向具体的页和记录的。并且一个叶子有一个指针指向下一个叶子。
使用索引需要注意:
⑴只对WHERE和ORDER BY需要查询的字段设置索引,避免无意义的硬盘开销;
⑵组合索引支持前缀索引;
⑶更新表的时候,如增删记录,MySQL会自动更新索引,保持树的平衡;因此更多的索引意味着更多的维护成本
索引的字段类型问题
text类型,也可建索引(需指定长度)
myisam存储引擎索引键长度综合不能超过1000字节
用来筛选的值尽量保持和索引列同样的数据类型
索引分四类:
index ----普通的索引,数据可以重复
fulltext----全文索引,用来对大表的文本域(char,varchar,text)进行索引。语法和普通索引一样。
unique ----唯一索引,唯一索引,要求所有记录都唯一
primary key ----主键索引,也就是在唯一索引的基础上相应的列必须为主键
like 不能用索引?
尽量减少like,但不是绝对不可用,”xxxx%” 是可以用到索引的,
想象一下,你在看一本成语词典,目录是按成语拼音顺序建立,查询需求是,你想找以 “一”字开头的成语(”一%“),和你想找包含一字的成语(“%一%”)
除了like,以下操作符也可用到索引:
,>=,BETWEEN,IN
<>,not in ,!=则不行
原则
1,单表数据太少,索引反而会影响速度;更新非常频繁的数据不适宜建索引
2,where后的条件,order by ,group by 等这样过滤时,后面的字段最好加上索引。根据实际情况,选择PRIMARY KEY、UNIQUE、INDEX等索引,但是不是越多越好,要适度
3,联合查询,子查询等多表操作时关连字段要加索引
ps:数据量特别大的时候,最好不要用联合查询,即使你做了索引
多列查询该如何建索引?
一次查询只能用到一个索引,所以 首先枪毙 a,b各建索引方案
a还是b? 谁的区分度更高(同值的最少),建谁!
当然,联合索引也是个不错的方案,ab,还是ba,则同上,区分度高者,在前
联合索引的问题?
where a = “xxx” 可以使用 AB 联合索引
where b = “xxx” 则不可 (再想象一下,这是书的目录?)
所以,大多数情况下,有AB索引了,就可以不用在去建一个A索引了
详解:
联合索引又叫复合索引。对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效。
两个或更多个列上的索引被称作复合索引。
利用索引中的附加列,您可以缩小搜索的范围,但使用一个具有两列的索引 不同于使用两个单独的索引。复合索引的结构与电话簿类似,人名由姓和名构成,电话簿首先按姓氏对进行排序,然后按名字对有相同姓氏的人进行排序。如果您知 道姓,电话簿将非常有用;如果您知道姓和名,电话簿则更为有用,但如果您只知道名不姓,电话簿将没有用处。
所以说创建复合索引时,应该仔细考虑列的顺序。对索引中的所有列执行搜索或仅对前几列执行搜索时,复合索引非常有用;仅对后面的任意列执行搜索时,复合索引则没有用处。
如:建立 姓名、年龄、性别的复合索引。
create table test(
a int,
b int,
c int,
KEY a(a,b,c)
);
优: select * from test where a=10 and b>50
差: select * from test where a50
优: select * from test order by a
差: select * from test order by b
差: select * from test order by c
优: select * from test where a=10 order by a
优: select * from test where a=10 order by b
差: select * from test where a=10 order by c
优: select * from test where a>10 order by a
差: select * from test where a>10 order by b
差: select * from test where a>10 order by c
优: select * from test where a=10 and b=10 order by a
优: select * from test where a=10 and b=10 order by b
优: select * from test where a=10 and b=10 order by c
优: select * from test where a=10 and b=10 order by a
优: select * from test where a=10 and b>10 order by b
差: select * from test where a=10 and b>10 order by c
索引原则
1.索引越少越好
原因:主要在修改数据时,第个索引都要进行更新,降低写速度。
2.最窄的字段放在键的左边
3.避免file sort排序,临时表和表扫描.
哪些常见情况不能用索引?
like “%xxx”
not in , !=
对列进行函数运算的情况(如 where md5(password) = “xxxx”)
WHERE index=1 OR A=10
存了数值的字符串类型字段(如手机号),查询时记得不要丢掉值的引号,否则无法用到该字段相关索引,反之则没关系
也即
select * from test where mobile = 13711112222;
可是无法用到mobile字段的索引的哦(如果mobile是char 或 varchar类型的话)
btw,千万不要尝试用int来存手机号(为什么?自己想!要不自己试试)
覆盖索引(Covering Indexes)拥有更高效率
索引包含了所需的全部值的话,就只select 他们,换言之,只select 需要用到的字段,如无必要,可尽量避免select *
NULL 的问题
NULL会导致索引形同虚设,所以在设计表结构时应避免NULL 的存在(用其他方式表达你想表达的NULL,比如 -1?)
如何查看索引信息,如何分析是否正确用到索引?
show index from tablename;
explain select ……;
关于explain,改天可以找个时间专门写一篇入门帖,在此之前,可以尝试 google
了解自己的系统,不要过早优化!
过早优化,一直是个非常讨厌而又时刻存在的问题,大多数时候就是因为不了解自己的系统,不知道自己系统真正的承载能力
比如:几千条数据的新闻表,每天几百几千次的正文搜索,大多数时候我们可以放心的去like,而不要又去建一套全文搜索什么的,毕竟cpu还是比人脑厉害太多
最后:永远别忘记的关键词sql注入
mysql索引与md5_MySQL理解索引、添加索引的原则相关推荐
- mysql索引增加栏位_mysql 添加索引 mysql 如何创建索引
1.添加PRIMARY KEY(主键索引) mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 2.添加UNIQUE(唯一索引 ...
- mysql 添加表索引语句_mysql 为表添加索引
索引作用 在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率.特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍. 例如,有3个 ...
- mysql千万级大表在线添加索引
#怎样向有大量数据的表中添加索引 文章目录 前言 一.使用步骤 总结 前言 在日常开发过程中我们可能会遇见这种场景,就是为了优化查询我们需要对某张表中的某个字段添加索引,但表中存在大量数据,而且正式库 ...
- python增加索引_python – 为numpy数组添加索引
我有一个numpy数组: prob_rf = [[0.4, 0.4, 0.4], [0.5, 0.5, 0.5], [0.6, 0.6, 0.6]] 我想为每个内部数组添加一个索引号: prob_rf ...
- 理解mysql添加索引查询速度就变快了
参考:https://mp.weixin.qq.com/s/Vx4BBUZuOxlHNP3z5KPGs https://blog.csdn.net/samll_snail/article/detail ...
- MySQL PK,FK,视图,索引,引擎总结【12000字概览MySQL】用于查漏补缺
Java养成计划----学习打卡第七十四,五,六天 内容导航 主键的注意要点 外键约束 foreign key FK 父子的顺序 外键约束的创建格式 存储引擎 SHOW ENGINES\G 常用引擎 ...
- mysql必备核心知识之主键索引
什么是主键索引? 把主键添加索引就是主键索引,它是一种特殊的唯一索引,不允许有空值,而唯一索引(unique是允许为空值的).指定为"PRIMARY KEY" 主键:主键是表的某一 ...
- mysql如何建立索引workbench_MySQL数据库中如何正确的理解与使用索引?
索引是存储引擎用于快速查找记录的一种数据结构,我们可以通过合理的使用数据库索引以提高数据库的访问效率.接下来主要介绍在MySQL 数据库中索引类型,以及如何创建出更加合理且高效的索引技巧. MySQL ...
- php 增加mysql 索引,【PHP】为什么 MySQL 添加索引后就可以提高查询速度
遇到这种问题,你就要高度集中,保持空杯心态,脑海里要有以下三个问题 为什么添加索引会提高查询速度 索引提高了查询速度对增删改有影响 索引常用的算法原理分析B树和B+树 下面来详细介绍介绍 为什么添加索 ...
最新文章
- android 汉字转字节,android实现汉字转拼音功能 带多音字识别
- 获取烧瓶请求中收到的数据
- 2015第36周一高效程序员的45个习惯
- .net中实现拖拽控件
- 【C++】50.编程中切换状态的【有限状态机】
- 《算法竞赛入门经典》习题4-2 正方形 (Squares,ACM,ICPC World Finals 1990,UVa201)——仅提供大体方法
- Unity预计算全局实时GI(gi params)
- 国产自主可控的MBSE解决方案和全数字仿真平台(SkyEye)
- Centos7使用yum安装Mysql5.7.19的详细步骤(可用)
- java 路由器接口的作用是什么_路由器的接口和用途
- 开课吧:浅析语音识别算法工程师能力要求
- mysql报错:ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
- android stadio 编译报错:download fastutil-7.2.0.jar
- Android JNI 自定义对象为参数和返回值
- java 既不是内部命令也不是外部命令的解决办法
- 【C语言】谭浩强C语言程序设计第五版135页例5.11译密码题的新解
- 基于群晖DS216+II的家庭存储解决方案
- mysql语法之update
- mysql默认数据库名_mysql默认数据库
- MentoHUST的使用教程
热门文章
- ReRes 谷歌浏览器插件使用
- Unreal Engine 4 UE4 CAVE VR 立体 Stereo nDisplay 多通道
- 比较全的一个项目(PC端)
- [英语]ab/abs/ac/acr词根讲解
- Excel从手机号和座机号混合文本中提取手机号码
- python课程设计矩阵对角线之和_Python二维数组实现求出3*3矩阵对角线元素的和示例...
- 【CTS2019】氪金手游(动态规划)
- 微信公众号图卡片息发送【模拟发送一个小程序信息】
- RedisGeo实现增删改查 java计算指定坐标最近的距离并排序
- 关于lock_guard