mysql 索引优化,索引建立原则和不走索引的原因
第一:选择唯一性索引
唯一性索引的值是唯一的,可以更快捷的通过该索引来确定某条记录.
2.索引的列为where 后面经常作为条件的字段建立索引
如果某个字段经常作为查询条件,而且又有较少的重复列或者是唯一咧可以考虑作为索隐列
经常作为查询条件的列作为索引会提高速度
3.位经常需要进行排序.分组和联合操作的的字段建立索引.
order by group by distinct union
这种情况下在查询的时候排序会浪费很多的时间,
如果为其建立索引可以有效的避免排序操作.
4.限制索引的的数目,索引的数目多,对系统的资源也是一种消耗,删除修改也会费资源.
5.劲量使用数据量少的索引. 或者索引前缀索引.
如果索引的值很长, 查询速度就会受到影响.
6.尽量使用前缀来索引
如果索引字段的值很长,最好使用值的前缀来索引。例如,TEXT和BLOG类型的字段,进行全文检索
会很浪费时间。如果只检索字段的前面的若干个字符,这样可以提高检索速度。
7.删除不再使用的索引.数据或者业务变更,数据方式变更就需要,删除无用的索引.
8.小表不应该建立索引.
这篇文章主要记录,我对如何找未使用索引的理解及风险(目前还未找到理想方法),能像oracle保存执行计划,根据执行计划(v$sql_plan)来判断索引使用情况是比较安全。当然oracle的index monitor特性类似percona的userstat有比较大的风险。
以下四个工具(方法)是在mysql找未使用索引比较方便,但都存在一定风险
1、mysqlidxchx
2、pt-index-usage
3、userstat
4、check-unused-keys
1、mysqlidxchx工具很长时间没有更新,但主要用来分析general log、slow.log,来判断实例中那个索引是可以删除,但这个工具没有经过实战,风险很大。
2、pt-index-usage原理来类似mysqlidxchx,执行过程中性能消耗比较严重,如果要在生产库上部署,最好在凌晨业务低锋时使用,pt-index-usage只支持slow.log格式的文件,如果要全面分析整个实例索引使用情况,需要long_query_time设置成0,才能把所以的sql记录下来,但同时会对磁盘空间造成压力,同时pt-index-usage对大文件分析就是件痛苦的事。当然pt-index-usage可以考虑部分表索引使用情况的确认。
3、最看好的userstat,收集信息性能优越,成本低。这个patch是google贡献的(userstat_running),percona把它改名成userstat,默认是不开启的,开启是会收集客户端、索引、表、线程信息存储在CLIENT_STATISTICS、INDEX_STATISTICS、TABLE_STATISTICS、THREAD_STATISTICS。Userstat的bug导致的问题太严重,直接导致mysql crash,到目前淘宝生产环境还没有使用。
4、Ryan Lowe的check-unused-keys脚本基于userstat,能够比较方便输出需要删除的索引。
小结:mysql能把每条sql执行计划保存在性能视图中,写入性能视图成本是非常小,用户可以根据执行计划来判断索引使用情况,分析执行计划突变的监控。
=-===================================================
简单记忆建议索引的原则是 :唯一列 经常被查询 排序 预先建立索引 总体控制数量 使用字段少的列索引 前缀索引 删除无用 小表不建
=========================================================================================================================
不走索引的原因:
1.没有查询条件没where 后面的内容 查询条件没索引
2.查询条件没引导列. 没有有索引的列
3.查询数量是超过表的一部分,mysql30%,oracle 20%
4.索引失效,索引插入过多可能发生意外失效
5.查询条件使用函数在索隐列上面.计算等.
查询条件使用函数在索引列上,或者对索引列进行运算,运算包括(+,-,*,/,! 等)
错误的例子:select * from test where id-1=9; 正确的例子:select * from test where id=10;
6.对小表查询
7.统计数据不真实.
8.CBO计算走索引花费过大的情况
9查询条件字符串和数字等的隐式转换.
10.!= <>
11.%% 两个百分号不走索引,开始的结尾的百分号走索引.
14 not in not exist in 劲量转换为union
15, time 和date 时间格式不一致
16.17,B-tree索引is null不会走,is not null会走,位图索引 is null,is not null 都会走
索隐列避免空列,一般选非空的列.
====
MyISAM 存储引擎索引键长度总和不能超过1000 字节;
BLOB 和TEXT 类型的列只能创建前缀索引;
MySQL 目前不支持函数索引;
使用不等于(!= 或者<>)的时候MySQL 无法使用索引;
过滤字段使用了函数运算后(如abs(column)),MySQL 无法使用索引;
Join 语句中Join 条件字段类型不一致的时候MySQL 无法使用索引;
使用LIKE 操作的时候如果条件以通配符开始( '%abc...')MySQL 无法使用索引;
使用非等值查询的时候MySQL 无法使用Hash 索引;
在我们使用索引的时候,需要注意上面的这些限制,
尤其是要注意无法使用索引的情况,因为这很容易让我们因为疏忽而造成极大的性能隐患。
mysql 索引优化,索引建立原则和不走索引的原因的更多相关文章
- Mysql数据库优化技术之配置篇、索引篇 ( 必看 必看 转)
转自:Mysql数据库优化技术之配置篇.索引篇 ( 必看 必看 ) (一)减少数据库访问对于可以静态化的页面,尽可能静态化对一个动态页面中可以静态的局部,采用静态化部分数据可以生成XML,或者文本文件 ...
- Mysql性能优化:为什么要用覆盖索引?
导读 相信读者看过很多MYSQL索引优化的文章,其中有很多优化的方法,比如最佳左前缀,覆盖索引等方法,但是你真正理解为什么要使用最佳左前缀,为什么使用覆盖索引会提升查询的效率吗? 本篇文章将从MYSQ ...
- Mysql性能优化:如何给字符串加索引?
导读 现代大部分的登录系统都支持邮箱.手机号码登录两种方式,那么如何在邮箱或者手机号码这个字符串上建立索引才能保证性能最佳呢? 今天这篇文章就来探讨一下在Mysql中如何给一个字符串加索引才能达到性能 ...
- mysql性能优化学习笔记(4)索引的优化
一.选择合适的索引列 1.在where,group by,order by,on从句中出现的列 2.索引字段越小越好(因为数据库的存储单位是页,一页中能存下的数据越多越好 ) ...
- Mysql 性能优化20个原则(1)
今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据 ...
- Mysql 性能优化20个原则(2)
5. 在Join表的时候使用相当类型的例,并将其索引 如果你的应用程序有很多 JOIN 查询,你应该确认两个表中Join的字段是被建过索引的.这样,MySQL内部会启动为你优化Join的SQL语句的机 ...
- Mysql 性能优化20个原则(4)
16. 垂直分割 “垂直分割”是一种把数据库中的表按列变成几张表的方法,这样可以降低表的复杂度和字段的数目,从而达到优化的目的.(以前,在银行做过项目,见过一张表有100多个字段,很恐怖) 示例一:在 ...
- Mysql 性能优化20个原则(3)
12. Prepared Statements Prepared Statements很像存储过程,是一种运行在后台的SQL语句集合,我们可以从使用 prepared statements 获得很多好 ...
- 数据库(二)—— MySQL索引优化
目录 MySQL的索引优化 一.MySQL 5.7的初始化配置 二.MySQL配置文件 1.配置 2.配置文件作用 三.多实例 1.创建相关的目录 2.创建实例的配置文件 3.初始化 4.授权 5.启 ...
随机推荐
- 获取OS X中App Store更新后的安装包(如XCode)
如果宿舍有好几个人需要更新一些大的软件,如XCode,会占用很大的带宽. 为了节省带宽,我们可以在1台电脑上更新完后,获取存放在系统暂存区的更新的安装包,然后通过局域网或Airdrop的方式轻松分 ...
- JQuery给动态HTML绑定事件
说明:涉及到事件委托原理,这里不深究了. 直接使用live或者delegate去实现.网上说on也可以,没测试过. 注意:live在新版的JQuery已经取消.on在比较新的版本才支持. 参考: ht ...
- [测试技术分享]DNS域传送漏洞测试
DNS域传送漏洞测试 1.简介: DNS(Domain Name System)也叫域名管理系统,它它建立在一个分布式数据库基础之上,在这个数据库里,保存了IP地址和域名的相互映射关系.正因为DNS的 ...
- Ubuntu 14 下,命令行终端显示短路径
Ubuntu的终端命令行默认是长路径,即把路径深度全部显示出来,操作起来不是很方便,下面介绍命令行显示短路径的操作: $ vi ~/.bashrc 找到PS1= 的行,将\w(小写)改成\W(大写 ...
- 【spring boot】spring cloud下spring boot微服务启动没有报错,但是访问访问不到
spring cloud下spring boot微服务启动没有报错,但是访问访问不到 解决方法: 可能是端口被占用了,但是依旧启用成功了. 更改一下项目启用的端口号,再重新启动查看是否可以正常访问.
- 重设Windows 7密码 z
Restart the computer to boot using the CD. Once the GUI loads, press SHIFT+F10 to bring up the comma ...
- 如何查看oracle的sid
1.怎样查看Oracle的数据库名称sid 用sysdba身份登录 比如 conn sys/密码 as sysdba 匿名管理员登陆 执行 select name form V$database; ...
- php之防注入程序绕过浅谈
<?php/*判断传递的变量是否含有非法字符如:$_POST/$_GET功能:SQL防注入系统*/ //屏蔽错误提示error_reporting(7); //需要过滤的字符 $ArrFiltr ...
- Robomongo与MongoDB的故事
Robomongo,Mongo可视化工具 哇唔,事实上她是三(阴险脸). 你看你看,界面清新,让人家心旷神怡(害羞).谁还想win+R+mongo呀呀呀?! 哎呀呀,继续···说正事. 在这里···借 ...
- MyEclipse图表工具Birt的使用技巧(三)--连接webservice数据源
Web Services 技术是一套标准.它定义了应用程序怎样在Web上实现互操作. 用户能够使用不论什么语言.在不同的平台下编写Web Services.然后通过Web Services 的标准来对 ...