MySQL的索引

什么是索引

       索引(MySQL中,索引是在存储引擎层实现,每一个索引在InnoDB里面对应一颗B+树)是用来提高数据库数据查询效率的常用重要手段,类似书籍的目录,通过目录,可以快速找到需要的书的内容。

索引的原理

       建立了针对数据内容的排序结果的指针,我们可以根据指针快速定位所要的数据。

索引模型

  • 哈希表: 哈希索引做区间查询速度慢,比较适用于只有等值查询的场景
  • 有序数组:在等值查询和范围查询场景中性能都比较好,只适用于静态存储引擎,即基本不会插入数据,因为插入数据效率非常低下
  • 搜索树:二叉树搜索效率最高,但是实际上大多数的数据库存储并不使用二叉树,因为索引不止存在内存中,还要写到磁盘上。因此,N叉树更广泛应用于数据库引擎中。

       根据叶子节点的内容,索引类型分为主键索引和非主键索引,主键索引的叶子节点存的是整行数据,在InnoDB里,主键索引也被称为聚簇索引(clustered index),非主键索引的叶子节点的内容是主键的值,在InnoDB里,非主键索引被称为二级索引(secondary index)。

索引的设计原则

  • 索引列一般为where子句中的列或连接子句中的列
  • 尽量不对其数小的列做索引,如性别列
  • 尽可能使用短索引:如果对字符列索引尽量指定最小长度
  • 复合索引前缀特性,索引的顺序很重要(创建复合索引时应将最常用作限制条件的列放在最左边,依次递减)
  • 避免出现无用的索引(很少用或从未被使用) 
  • 对于Innodb引擎,尽量指定主键,最常用较短数据类型唯一列做主键
  • 尽量使用定长字符类型char,而不用varchar
  • 索引列如果存在空值,查询不走索引

避免过度使用索引

  • 索引的建立对提高检索能力很有用,但是数据库维护它很需要资源
  • 对性别列索引,它只有两个值,建索引不仅没优势,还会影响到插入、更新的速度
  • 索引会占用磁盘空间,降低写操作,执行计划要考虑各个索引。
  • 索引不是越多越好,建立索引的一般都是大表
  • 100行数据以内的表可以不建立索引

示例SQL

           show index from {table_name}       查看表的索引

           help create index                             查看帮助:help {content}

           desc {table_name}                           查看表结构

           drop index {index_name} on {table_name}

常用的优化SQL的语句

       

  1. explain 查看sql 语句的执行情况

                 explain select * from aa where b='c';               可以看一个sql是否在查询用了索引(结果说明参考Mysql语句)

             2. show processlist;   

             3. show full processlist;

             4. show variables like 'profiling'   可以分析sql语句

                 set profiling=1;(开启profiling)

MySQL的索引_第1张图片

           知道了query_id后,可以看其详细信息:

           

           结果如下:

           MySQL的索引_第2张图片

           5. mysql -uroot -p'11111' -e "show full processlist" | grep -vi sleep   -> 过滤掉sleep状态的          

MySQL数据库使用索引的条件

  1. MySQL(BTREE)使用索引的比较条件:

                 <  <= = > >= between in !=或<> like 'xx%'

             2. 索引的列不包含null值

             3. 列类型是字符串时,要在where条件中把字符串值用引号括起来

             4. 用or分割开的条件,or前条件有索引,而后面列无索引,则涉及的索引都不会被用到

             5. 条件不是索引列的第一部分

             6. like语句'%ss%'操作不会索引,而'ss%'会

             7. 列上进行运算会导致索引失效而进行全表扫描

             8. 不要使用not in和<>操作, not in可以用not exists代替, id<>3可以使用id>3 or id<3代替

网站查询慢的原因分析

  1. 如果有大量频繁的搜索,一般是由爬虫在爬网站,可以分析WEB日志(利用AWSTATS)IP封掉
  2. 配置多个主从同步,程序上实现读写分离,减轻主库的读写压力
  3. 登录后才可以搜索,这个需求按需实现,因为用户体验不够好
  4. 数据库前端加memcached缓存服务器
  5. like '%aaa%'这样的sql一般很难优化,如果必须,可以通过搜索服务Sphinx等搜索引擎实现搜索
  6. 利用C或ruby来开发程序,实现每日读库计算搜索索引,保存在服务器上提供搜索,然后,每5分钟在从库做一次增量

你可能感兴趣的:(MySQL)