索引是数据库中用来提高性能的最常用工具。所有MySql列类型都可以被索引。索引用于快速找出在某个列中有一特定值的行。如果不使用索引,MYSQL必须从第一条记录开始然后读完整个表直到找出相关的行。常用的包括BTREE索引和HASH索引。

创建的语句:

 CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [USING index_type]
on tbl_nam(index_col_name,……)
  • 1
  • 2
  • 3

删除索引语句:

DROP INDEX index_name ON tbl_name
  • 1
  • 2

设计索引的规则:

  1. 最适合索引的列是出现在where子句中的列,或连接子句中指定的列,而不是出现在select关键字后的选择列表中的列。
  2. 索引的列的基数越大,索引的效果越好。
  3. 尽量使用短索引。能够节省大量索引空间,也可能使查询更快。
  4. 不要过度索引。索引都要占用额外的磁盘空间,并降低写操作的性能。在修改表的内容时,索引必须进行更新,有时可能需要重构。
BTREE索引和HASH索引的比较

1、B-Tree索引

索引存储的值按索引列中的顺序排列。可以用B-Tree索引进行全关键字、关键字范围和关键字前缀查询。如果使用索引,必须保证按索引最左边前缀进行查询。由于B树中节点是顺序存储的,可以对查询结果进行order by。

限制:

1)查询必须从索引的最左边的列开始

2)不能跳过某一索引列。

3)存储引擎不能使用索引中范围条件右边的列。

例如,如果你的查询语句为WHERE last_name=”Smith” AND first_name LIKE ‘J%’ AND dob=’1976-12-23’,则该查询只会使用索引中的前两列,因为LIKE是范围查询。

2、Hash索引
MySQL中只有Memory存储引擎显示支持hash索引,是默认索引类型,它也支持B-Tree索引。

如果多个值有相同的hash code,索引把它们的行指针用链表保存到同一个hash表项中。
因为索引自己仅仅存储很短的值,所以索引非常紧凑,hash值不取决于列的数据类型,
int列的索引和长字符串列的索引一样大。

3、总结

  1. HASH索引适合等式比较的操作,不能用来加速order by操作,也不能确定在两个值之间大约有多少行,会影响一些查询的执行效率。而且只能使用整个关键字来搜索一行。
  2. BTREE索引,使用大于,小于,BETWEEN,不等于,LIKE等操作符的时候都可以用。对索引字段进行范围查询的时候,只有BTREE索引可以通过索引访问。HASH索引实际上是全表扫描的。

如果对多列进行索引,列的顺序非常重要,MySQL仅能对索引最左边的前缀进行有效查找。

假设存在组合索引it1c1c2(c1,c2),查询语句select * from t1 where c1=1 and c2=2能够
使用该索引。查询语句select * from t1 where c1=1也能够使用该索引。
但是,查询语句select * from t1 where c2=2不能够使用该索引,
因为没有组合索引的引导列,即,要想使用c2列进行查找,必需出现c1等于某值。

索引是在存储引擎中实现的,不是在服务器层中实现的。所以,每种存储引擎的索引都不
一定完全相同,并不是所有的存储引擎都支持所有的索引类型。

高性能索引策略

1、聚簇索引
聚簇索引保证关键字的值相近的元组存储的物理位置也相同(所以字符串类型不宜建立聚簇索引,
特别是随机字符串,会使得系统进行大量的移动操作),且一个表只能有一个聚簇索引。
因为由存储引擎实现索引,所以,并不是所有的引擎都支持聚簇索引。
目前,只有solidDB和InnoDB支持。

2、覆盖索引

索引的使用

1)索引不会包含有null值得列

2)尽量使用短索引,对串列进行索引,如果可能应该指定一个前缀长度。短索引不仅可以提高查询速度而且可以节省磁盘空间和IO操作

3)like语句操作:like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。

4)不要在列上进行运算
例如:select * from users where
YEAR(adddate)<2007,将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成:select * from
users where adddate<’2007-01-01′。

使用限制:

1)由于索引仅包含hash code和记录指针,所以,MySQL不能通过使用索引避免读取记录。但是访问内存中的记录是非常迅速的,不会对性能造成太大影响

2)不能使用hash索引排序。

3)Hash索引不支持键的部分匹配,因为是通过整个索引值来计算hash值的。

4)Hash索引只支持等值比较,例如使用=,IN( )和<=>。对于WHERE price>100并不能加速查询。

最新文章

  1. angular
  2. angularjs ocLazyLoad分步加载js文件,angularjs ocLazyLoad按需加载js
  3. hdu 3089 约瑟夫环
  4. 8个主要的Velocity语法使用说明
  5. Mathematica 中 Minimize函数无法找到全局最小值时的解决方法
  6. ES 父子文档查询
  7. openStack 性能开测-2
  8. JIRA描述默认值设置
  9. PHP变量处理之serialize
  10. 【APS.NET 框架系列】浅谈ASP.NET 框架
  11. 主备(keepalived+haproxy)
  12. hihocoder [Offer收割]编程练习赛52 D 部门聚会
  13. xcode7,AFN不能使用的问题
  14. @validated 验证 List 参数在spring中
  15. 如何设置 jenkins 任务执行的历史记录在左侧显示的格式?
  16. jdk和jvm基本介绍
  17. WPF 显示 mp3 专辑图片
  18. .net程序中http请求的超时配置
  19. 提高Android Studio的Build速度实践
  20. Scrum立会报告+燃尽图(十月二十四日总第十五次)

热门文章

  1. 【动态规划】【记忆化搜索】CODEVS 3409 搬运礼物 CodeVS原创
  2. 【前缀和】【前缀MAX】洛谷 P1351 NOIP2014提高组 day1 T2 联合权值
  3. 《深入理解Spark-核心思想与源码分析》(二)第二章Spark设计理念和基本架构
  4. iOS键盘监听事件
  5. React Native Navigator组件回调
  6. Github上的iOS资料-个人记录
  7. JAVA 按时间排序
  8. 64945e3dtw1dii6vfdr19j.jpg(PNG 图像,1497x929 像素)
  9. powerbuilder webbrowser 内嵌浏览器 select下拉框无法使用
  10. 解决IIS服务和用户上传的文件分别部署在不同的电脑上时,解决权限的问题