所谓索引就是为特定的mysql字段进行一些特定的算法排序,比如二叉树的算法和哈希算法,哈希算法是通过建立特征值,然后根据特征值来快速查找。而用的最多,并且是mysql默认的就是二叉树算法 BTREE,通过BTREE算法建立索引的字段,比如扫描20行就能得到未使用BTREE前扫描了2^20行的结果。

Explain优化查询检测

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

使用方法,在select语句前加上Explain就可以了:

mysql在执行一条查询之前,会对发出的每条SQL进行分析,决定是否使用索引或全表扫描如果发送一条select * from blog where false,Mysql是不会执行查询操作的,因为经过SQL分析器的分析后MySQL已经清楚不会有任何语句符合操作。

实例

select_typesimple:简单select(不使用union或子查询)。

primary:最外面的select。

union:union中的第二个或后面的select语句。

dependent union:union中的第二个或后面的select语句,取决于外面的查询。

union result:union的结果。

subquery:子查询中的第一个select。

dependent subquery:子查询中的第一个select,取决于外面的查询。

derived:导出表的select(from子句的子查询)。

其它说明Distinct:一旦MYSQL找到了与行相联合匹配的行,就不再搜索了。

Not exists: MYSQL优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行,就不再搜索了。

Range checked for each Record(index map:#):没有找到理想的索引,因此对于从前面表中来的每一个行组合,MYSQL检查使用哪个索引,并用它来从表中返回行。这是使用索引的最慢的连接之一。

Using filesort: 看到这个的时候,查询就需要优化了。MYSQL需要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来排序全部行。

Using index: 列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候。

Using temporary 看到这个的时候,查询需要优化了。这里,MYSQL需要创建一个临时表来存储结果,这通常发生在对不同的列集进行ORDER BY上,而不是GROUP BY上。

Where used 使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。如果不想返回表中的全部行,并且连接类型ALL或index,这就会发生,或者是查询有问题不同连接类型的解释(按照效率高低的顺序排序)。

system 表只有一行:system表。这是const连接类型的特殊情况。

const:表中的一个记录的最大值能够匹配这个查询(索引可以是主键或惟一索引)。因为只有一行,这个值实际就是常数,因为MYSQL先读这个值然后把它当做常数来对待。

eq_ref:在连接中,MYSQL在查询时,从前面的表中,对每一个记录的联合都从表中读取一个记录,它在查询使用了索引为主键或惟一键的全部时使用。

ref:这个连接类型只有在查询使用了不是惟一或主键的键或者是这些类型的部分(比如,利用最左边前缀)时发生。对于之前的表的每一个行联合,全部记录都将从表中读出。这个类型严重依赖于索引匹配的记录多少,越少越好。

range:这个连接类型使用索引返回一个范围中的行,比如使用>或

index: 这个连接类型对前面的表中的每一个记录联合进行完全扫描(比ALL更好,因为索引一般小于表数据)。

ALL:这个连接类型对于前面的每一个记录联合进行完全扫描,这一般比较糟糕,应该尽量避免。

其中type:如果是Only index,这意味着信息只用索引树中的信息检索出的,这比扫描整个表要快。

如果是where used,就是使用上了where限制。

如果是impossible where 表示用不着where,一般就是没查出来啥。

如果此信息显示Using filesort或者Using temporary的话会很吃力,WHERE和ORDER BY的索引经常无法兼顾,如果按照WHERE来确定索引,那么在ORDER BY时,就必然会引起Using filesort,这就要看是先过滤再排序划算,还是先排序再过滤划算。

索引的类型

UNIQUE唯一索引

不可以出现相同的值,可以有NULL值。

INDEX普通索引

允许出现相同的索引内容。

PRIMARY KEY主键索引

不允许出现相同的值,且不能为NULL值,一个表只能有一个primary_key索引。

fulltext index 全文索引

上述三种索引都是针对列的值发挥作用,但全文索引,可以针对值中的某个单词,比如一篇文章中的某个词。

索引的CURD

索引的创建

ALTER TABLE

适用于表创建完毕之后再添加。

ALTER TABLE 表名 ADD 索引类型 (unique,primary key,fulltext,index)[索引名](字段名)

CREATE INDEX

CREATE INDEX可对表增加普通索引或UNIQUE索引。

另外,还可以在建表时添加:

索引的删除

索引的查看

索引的更改

删掉重建一个既可

创建索引的技巧维度高的列创建索引。数据列中不重复值出现的个数,这个数量越高,维度就越高。

如数据表中存在8行数据a,b ,c,d,a,b,c,d这个表的维度为4。

要为维度高的列创建索引,如性别和年龄,那年龄的维度就高于性别。

性别这样的列不适合创建索引,因为维度过低。

2、对 where,on,group by,order by 中出现的列使用索引。

3、对较小的数据列使用索引,这样会使索引文件更小,同时内存中也可以装载更多的索引键。

4、为较长的字符串使用前缀索引。

5、不要过多创建索引,除了增加额外的磁盘空间外,对于DML操作的速度影响很大,因为其每增删改一次就得从新建立索引。

6、使用组合索引,可以减少文件索引大小,在使用时速度要优于多个单列索引。

使用索引的小技巧

1.轴向长度权衡区分度与长度的技巧

截取不同长度,测试区分度

区别度能达到0.1,就可以。

2.左对齐不易区分的细分索引建立方法

这样的细分,左边有大量重复字符,某些网址细分汇总的http://倒过来存储并建立索引

新增伪hash变量把字符串转化为整型

3.索引覆盖

概念:如果查询的列恰好是索引的一部分,那么查询只需要在索引文件上进行,不需要回行到磁盘,这种查询,速度极快,江湖人称-索引覆盖

4.延迟关联

在根据条件查询数据时,如果查询条件不能用的索引,可以先输入数据行的id,再根据id去取数据行。

5.索引排序

排序的基线上加入索引,可以提高速度。

6.重复索引和冗余索引

重复索引:在同一列或相同顺序的几个列建立了多个索引,成为重复索引,没有任何意义,减少了

冗余索引:两个或多个索引所覆盖的列有重叠,而对于列m ,n,加索引index m(m),indexmn(m,n),称为冗余索引。

7.索引碎片与维护

在数据表长期的更改过程中,索引文件和数据文件都会产生空洞,形成碎片。修复表的过程十分耗费资源,可以用比较长的周期修复表。

8. innodb引擎的索引注意事项

Innodb表要尝试自己指定主键,如果有几个列都是唯一的,要选择最常作为访问条件的列作为主键,另外,Innodb表的普通索引都会保存主键的键值,因此主键要进行选择快照的数据类型,可以有效的减少索引的磁盘占用,提高索引的缓存效果。

组合索引与前缀索引

注意,这两种称呼是对建立索引技巧的一种称呼,并非索引的类型。

组合索引

MySQL单列索引和组合索引究竟有何区别呢?

为了形象地对比两者,先建一个表:

假设表内已有1000条数据,在这 10000 条记录里面 7 上 8 下地分布了 5 条 vc_Name=”erquan” 的记录,只不过 city,age,school 的组合各不相同。来看这条 T-SQL:

首先考虑建MySQL单列索引:

在 vc_Name 列上建立了索引。执行 T-SQL 时,MYSQL 很快将目标锁定在了 vc_Name=erquan 的 5 条记录上,取出来放到一中间结果集。在这个结果集里,先排除掉 vc_City 不等于”郑州”的记录,再排除 i_Age 不等于 25 的记录,最后筛选出唯一的符合条件的记录。虽然在 vc_Name 上建立了索引,查询时MYSQL不用扫描整张表,效率有所提高,但离我们的要求还有一定的距离。同样的,在 vc_City 和 i_Age 分别建立的MySQL单列索引的效率相似。

为了进一步榨取 MySQL 的效率,就要考虑建立组合索引。就是将 vc_Name,vc_City,i_Age 建到一个索引里:

建表时,vc_Name 长度为 50,这里为什么用 10 呢?这就是下文要说到的前缀索引,因为一般情况下名字的长度不会超过 10,这样会加速索引查询速度,还会减少索引文件的大小,提高 INSERT 的更新速度。

执行 T-SQL 时,MySQL 无须扫描任何记录就到找到唯一的记录!

如果分别在 vc_Name,vc_City,i_Age 上建立单列索引,让该表有 3 个单列索引,查询时和上述的组合索引效率一样吗?答案是大不一样,远远低于我们的组合索引。虽然此时有了三个索引,但 MySQL 只能用到其中的那个它认为似乎是最有效率的单列索引,另外两个是用不到的,也就是说还是一个全表扫描的过程。

建立这样的组合索引,其实是相当于分别建立了:vc_Name,vc_City,i_Age

vc_Name,vc_City

vc_Name

这样的三个组合索引!为什么没有 vc_City,i_Age 等这样的组合索引呢?这是因为 mysql 组合索引 “最左前缀” 的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这三列的查询都会用到该组合索引,下面的几个 T-SQL 会用到:SELECT * FROM myIndex WHREE vc_Name=”erquan” AND vc_City=”郑州” SELECT * FROM myIndex WHREE vc_Name=”erquan”

而下面几个则不会用到:SELECT * FROM myIndex WHREE i_Age=20 AND vc_City=”郑州” SELECT * FROM myIndex WHREE vc_City=”郑州”

也就是,name_city_age(vc_Name(10),vc_City,i_Age) 从左到右进行索引,如果没有左前索引Mysql不执行索引查询。

前缀索引

如果索引列长度过长,这种列索引时将会产生很大的索引文件,不便于操作,可以使用前缀索引方式进行索引前缀索引应该控制在一个合适的点,控制在0.31黄金值即可(大于这个值就可以创建)。

SELECT COUNT(DISTINCT(LEFT(title,10)))/COUNT(*) FROM Arctic; — 这个值大于0.31就可以创建前缀索引,Distinct去重复 ALTER TABLE user ADD INDEX uname(title(10)); — 增加前缀索引SQL,将人名的索引建立在10,这样可以减少索引文件大小,加快索引查询速度。

什么样的sql不走索引

要尽量避免这些不走索引的sql

多表关联时的索引效率SELECT sname FROM stu WHERE LEFT(date,4) <1990; — 不会使用索引,因为使用了函数运算,原理与上面相同

SELECT * FROM houdunwang WHERE uname LIKE’后盾%’ — 走索引

SELECT * FROM houdunwang WHERE uname LIKE “%后盾%” — 不走索引

从上图可以看出,所有表的type为all,表示全表索引。也就是6 6 6,共遍历查询了216次。

除第一张表示全表索引(必须的,要以此关联其他表),其余的为range(索引区间获得),也就是6+1+1+1,共遍历查询9次即可。

所以我们建议在多表join的时候尽量少join几张表,因为一不小心就是一个笛卡尔乘积的恐怖扫描,另外,我们还建议尽量使用left join,以少关联多。因为使用join 的话,第一张表是必须的全扫描的,以少关联多就可以减少这个扫描次数。

索引的弊端

不要盲目的创建索引,只为查询操作频繁的列创建索引,创建索引会使查询操作变得更加快速,但是会降低增加、删除、更新操作的速度,因为执行这些操作的同时会对索引文件进行重新排序或更新。

但是,在互联网应用中,查询的语句远远大于DML的语句,甚至可以占到80%~90%,所以也不要太在意,只是在大数据导入时,可以先删除索引,再批量插入数据,最后再添加索引。

更多学习内容可以访问https://zhuanlan.zhihu.com/p/165932664

以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要的可以加入我的PHP技术交流群953224940还有更多学习资料等你来领取噢进阶PHP月薪30k>>>架构师成长路线【视频、面试文档免费获取】(https://shimo.im/docs/Jky8td8RTvHTG6k9)

mysql字段简索引_Mysql索引优化攻略(全)相关推荐

  1. Python之pandas:对dataframe数据的索引简介、应用大全(输出索引/重命名索引列/字段去重/设置复合索引/根据列名获取对应索引)、指定某字段为索引列等详细攻略

    Python之pandas:对dataframe数据的输出索引.重命名索引列/字段去重/设置复合索引/根据列名获取对应索引.指定某字段为索引列等详细攻略 目录 对pandas中dataframe数据中 ...

  2. Python编程语言学习:for循环中常用方法经验技巧(利用enumerate函数对列表实现自带索引等)之详细攻略

    Python编程语言学习:for循环中常用方法经验技巧(利用enumerate函数对列表实现自带索引等)之详细攻略 目录 for循环中常用方法经验技巧 1.利用enumerate函数对列表实现for循 ...

  3. 网站优化怎样的外链能轻松收录,网站外链优化攻略

    有些事情,让你感到很无奈,网站外链优化也是如此,往往那些很容易发布网站外链的地方,价值不大,而不容易发布外链的地方,一旦发布上去了,效果胜过几十条甚至更多的外链,而且可以轻松让搜索引擎收录,网站优化怎 ...

  4. Win7系统服务优化攻略

    Win7系统服务优化攻略 2011年01月29日 Win7系统服务优化攻略 前文提到Windows系统启动的原理,其中加载各项系统服务是影响系统启动时间的重要因素. 1.了解 Windows 7 服务 ...

  5. EBS JVM 内存优化攻略

    EBS JVM 内存优化攻略 oacore [applmgr@appshost01 scripts]$ cd $ADMIN_SCRIPTS_HOME [applmgr@appshost01 scrip ...

  6. 七日杀unity报错_七日杀游戏闪退及各种游戏报错解决攻略全解

    七日杀是一款人称的丧尸生存类游戏,现在有非常多的游戏都是丧尸生存题材的,但是要找到比较精品的游戏,我还是推荐大家玩这款,这里跟大家分享一下七日杀游戏闪退及各种游戏报错解决攻略全解,大家如果有遇到问题可 ...

  7. 失落世界服务器国庆宝箱位置,失落的斯菲尔 图文攻略 全剧情任务流程全宝箱收集...

    原标题:失落的斯菲尔 图文攻略 全剧情任务流程全宝箱收集 <失落的斯菲尔>剧情流程图文攻略 游戏介绍: <失落的斯菲尔(Lost Sphear)>是由Tokyo RPG Fac ...

  8. 支付宝牵头,近30亿红包等你领,攻略全在这里了!

    支付宝牵头,近30亿红包等你领,攻略全在这里了! 过了腊八就是年!抢红包也就成了很多小伙伴过年的必备仪式!细数今年的红包战场可为是热闹异常,不仅多了几员实力大将,就连金额也让人瞠目. 支付宝坚持老路子 ...

  9. **Hadoop Ubuntu系统搭建攻略全详细!!!附带Hadoop搭建成功后测试案例**

    Hadoop Ubuntu系统搭建攻略全详细!!!附带Hadoop搭建成功后测试案例 Hadoop搭建教程 一.需要安装的工具: 1.首先确保虚拟机能连上网. 2.更新源列表: sudo apt-ge ...

  10. 熹妃传服务器维护10.16,熹妃传2016最新版厨艺大赛攻略全解

    以下就是小编为大家带来的熹妃传2016最新版厨艺大赛攻略全解: 皇后风寒 辣子鸡丁:鸡肉,辣椒,葱 油盐酱糖 大火 皇上脉象虚浮 清炖狮子头:猪肉,鸡蛋,白菜 水盐 中火 青松绿韭古嘉蔬 砂锅豆腐:豆 ...

最新文章

  1. C# 移动鼠标方法
  2. Java 集合框架综述
  3. ios13 无法传参_iOS13个人热点功能频遭投诉
  4. python os.forkos.wait
  5. 以服务器时间为基准显示到某一时间的倒计时
  6. 几个对字符串进行操作的函数
  7. 转载:图解SSL/TLS协议
  8. 二分法06:第一个错误的版本
  9. 非递归遍历二叉树-前序中序
  10. 阶段3 2.Spring_01.Spring框架简介_02.今日课程内容介绍
  11. 人口各省预测模型matlab_基于MATLAB的人口预测模型
  12. 小米笔记本怎么进入pe系统?
  13. CSAPP家庭作业答案7 8 9章
  14. Android编码架构MVx演进历史
  15. 博客总纲 博客目录V1
  16. eclipse中访问受限api
  17. MATLAB/Simulink当真,开环Buck、闭环Buck、双闭环Buck仿真;开环控制的半桥LLC谐振变换器,全桥LLC谐振变换器和电压闭环控制的半桥LLC
  18. [No0000158]思维模型1-20
  19. php户型图识别,五大指标教你看懂户型图
  20. requests-html 爬虫新库

热门文章

  1. 百度移动应用安卓_昔日明星91助手和安卓市场“下线” 百度那19亿美元值不值?...
  2. java 轻量级 web 框架,Fast-FrameWork
  3. golang mysql proxy_mixer: 一个用go实现的mysql proxy
  4. openwrt 遍译php_[OpenWrt Wiki] OpenWrt编译 – 说明
  5. Spark DataFrame 添加自增id
  6. Java泛型深入理解小总结
  7. ContentValues(Java)
  8. 跟我打卡LeetCode 61旋转链表62不同路径63不同路径 II
  9. 计算机网络(三)计算机网络-物理层 | 物理设备与传输介质(思维导图 | 知识点总结)
  10. mysql 事物状态有几种_MySQL知识点汇总:亿级高并发数据库运转原理大公开!