第一:选择唯一性索引

唯一性索引的值是唯一的,可以更快捷的通过该索引来确定某条记录.

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 索引优化,索引建立原则和不走索引的原因的更多相关文章

  1. Mysql数据库优化技术之配置篇、索引篇 ( 必看 必看 转)

    转自:Mysql数据库优化技术之配置篇.索引篇 ( 必看 必看 ) (一)减少数据库访问对于可以静态化的页面,尽可能静态化对一个动态页面中可以静态的局部,采用静态化部分数据可以生成XML,或者文本文件 ...

  2. Mysql性能优化:为什么要用覆盖索引?

    导读 相信读者看过很多MYSQL索引优化的文章,其中有很多优化的方法,比如最佳左前缀,覆盖索引等方法,但是你真正理解为什么要使用最佳左前缀,为什么使用覆盖索引会提升查询的效率吗? 本篇文章将从MYSQ ...

  3. Mysql性能优化:如何给字符串加索引?

    导读 现代大部分的登录系统都支持邮箱.手机号码登录两种方式,那么如何在邮箱或者手机号码这个字符串上建立索引才能保证性能最佳呢? 今天这篇文章就来探讨一下在Mysql中如何给一个字符串加索引才能达到性能 ...

  4. mysql性能优化学习笔记(4)索引的优化

    一.选择合适的索引列     1.在where,group by,order by,on从句中出现的列     2.索引字段越小越好(因为数据库的存储单位是页,一页中能存下的数据越多越好 )      ...

  5. Mysql 性能优化20个原则(1)

    今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据 ...

  6. Mysql 性能优化20个原则(2)

    5. 在Join表的时候使用相当类型的例,并将其索引 如果你的应用程序有很多 JOIN 查询,你应该确认两个表中Join的字段是被建过索引的.这样,MySQL内部会启动为你优化Join的SQL语句的机 ...

  7. Mysql 性能优化20个原则(4)

    16. 垂直分割 “垂直分割”是一种把数据库中的表按列变成几张表的方法,这样可以降低表的复杂度和字段的数目,从而达到优化的目的.(以前,在银行做过项目,见过一张表有100多个字段,很恐怖) 示例一:在 ...

  8. Mysql 性能优化20个原则(3)

    12. Prepared Statements Prepared Statements很像存储过程,是一种运行在后台的SQL语句集合,我们可以从使用 prepared statements 获得很多好 ...

  9. 数据库(二)—— MySQL索引优化

    目录 MySQL的索引优化 一.MySQL 5.7的初始化配置 二.MySQL配置文件 1.配置 2.配置文件作用 三.多实例 1.创建相关的目录 2.创建实例的配置文件 3.初始化 4.授权 5.启 ...

随机推荐

  1. &#x开头的是什么编码?

    在 Node 层利用 cheerio 解析网页时,输出的中文内容都是以 &#x 开头的一堆像乱码一样的东西,尝试过各种编码都无效,而且神奇的是,将这一堆“乱码”保存成网页后,通过浏览器打开又可 ...

  2. Linux命令之 file命令

    该命令用来识别文件类型,也可用来辨别一些文件的编码格式.它是通过查看文件的头部信息来获取文件类型,而不是像Windows通过扩展名来确定文件类型的. 执行权限 :All User 指令所在路径:/us ...

  3. 利用LogParser分析IIS日志

    LogParser是微软官方出品的用于读取分析IIS日志的工具,使用类SQL语句过滤文本日志内容,并可将内容导出到csv.sqlserver作进一步分析    下载地址:http://www.micr ...

  4. cocos2dx -lua 面向对象-转

    转自:http://www.himigame.com/lua-game/1282.html 上一篇中,向童鞋们介绍了如何自定义类binding到Lua中供给使用的教程,那么本篇将介绍利用OOP思想在在 ...

  5. js时间小总结

    1.js获取时间 var myDate = new Date(); 1 myDate.getYear(); //获取当前年份(2位) 2 myDate.getFullYear(); //获取完整的年份 ...

  6. PostgreSQL配置文件--WAL

    3 WAL WRITE AHEAD LOG 3.1 Settings 3.1.1 fsync 字符串 默认: fsync = on 开启后强制把数据同步更新到磁盘,可以保证数据库将在OS或者硬件崩溃的 ...

  7. jstack来分析。当linux出现cpu被java程序消耗过高时

    我们使用jdk自带的jstack来分析.当linux出现cpu被java程序消耗过高时,以下过程说不定可以帮上你的忙: 1.top查找出哪个进程消耗的cpu高 21125 co_ad2    18   ...

  8. JsonFX 序列化反序列化

    /// <summary> /// Json 序列化工具类 /// </summary> public class SerializeJsonUtility { /// < ...

  9. ajax 底层源码解析

    对象: XMLHttpRequest 属性:readyState请求状态,开始请求时值为0直到请求完成这个值增长到4 responseText目前为止接收到的响应体,readyState<3此属 ...

  10. 用BSF + Beanshell使Java程序能够运行字符串形式的代码(转载)

    BSF(Bean Scripting Framework)最初是IBM Alpha工作组的项目,后来贡献给了Apache,BSF使Java能够更好的与各种流行脚本语言整合,实现不同语言之间的交互功能. ...