本文转自:http://blog.csdn.net/lovelyhermione/article/details/4580866

Mysql数据库提供两种类型的索引,如果没正确设置,索引的利用效率会大打折扣却完全不知问题出在这。

CREATE TABLE test (  id         INT NOT NULL,  last_name  CHAR(30) NOT NULL,  first_name CHAR(30) NOT NULL,  PRIMARY KEY (id),  INDEX name (last_name,first_name)
);  

以上创建的其实是一个多列索引,创建列索引的代码如下:

CREATE TABLE test (  id         INT NOT NULL,  last_name  CHAR(30) NOT NULL,  first_name CHAR(30) NOT NULL,  PRIMARY KEY (id),  INDEX name (last_name),  INDEX_2 name (first_name)
);  

一个多列索引可以认为是包含通过合并(concatenate)索引列值创建的值的一个排序数组。 当查询语句的条件中包含last_name 和 first_name时,例如:

SELECT * FROM test WHERE last_name='Kun' AND first_name='Li';

sql会先过滤出last_name符合条件的记录,在其基础上在过滤first_name符合条件的记录。那如果我们分别在last_name和first_name上创建两个列索引,mysql的处理方式就不一样了,它会选择一个最严格的索引来进行检索,可以理解为检索能力最强的那个索引来检索,另外一个利用不上了,这样效果就不如多列索引了。

但是多列索引的利用也是需要条件的,以下形式的查询语句能够利用上多列索引:

SELECT * FROM test WHERE last_name='Widenius';  SELECT * FROM test WHERE last_name='Widenius' AND first_name='Michael';  SELECT * FROM test WHERE last_name='Widenius' AND (first_name='Michael' OR first_name='Monty');  SELECT * FROM test WHERE last_name='Widenius' AND first_name >='M' AND first_name < 'N';  

以下形式的查询语句利用不上多列索引:

SELECT * FROM test WHERE first_name='Michael';  SELECT * FROM test WHERE last_name='Widenius' OR first_name='Michael';  

多列建索引比对每个列分别建索引更有优势,因为索引建立得越多就越占磁盘空间,在更新数据的时候速度会更慢。

另外建立多列索引时,顺序也是需要注意的,应该将严格的索引放在前面,这样筛选的力度会更大,效率更高。

转载于:https://www.cnblogs.com/zhengwk/p/5779982.html

正确理解Mysql的列索引和多列索引相关推荐

  1. 正确理解MYSQL事务的可重复读RR隔离级别与锁

    1,mysql默认的事务隔离级别是可重复度. 可重复度就是在一个事务中对相同数据的多次查询将返回相同结果. 比如 事务1: BEGIN; SELECT age from student where i ...

  2. mysql having in_正确理解MySQL中的where和having的区别

    以前在学校里学习过SQLserver数据库,发现学习的都是皮毛,今天以正确的姿态谈一下MySQL中where和having的区别. 误区:不要错误的认为having和group by 必须配合使用. ...

  3. mysql where 与having_正确理解MySQL中的where和having的区别

    以前在学校里学习过SQLserver数据库,发现学习的都是皮毛,今天以正确的姿态谈一下MySQL中where和having的区别. 误区:不要错误的认为having和group by 必须配合使用. ...

  4. mysql中having的意思_正确理解MySQL中的where和having的区别

    展开全部 1.where和having都可以使用的32313133353236313431303231363533e4b893e5b19e31333363383964场景select goods_pr ...

  5. 深入理解MYSQL索引优化:多列索引

    索引是什么 是存储引擎用于找到数据的一种数据结构. C/C++ Linux服务器开发高级架构视频点击:C/C++Linux服务器开发高级架构师/Linux后台架构师-学习视频 MYSQL索引优化视频详 ...

  6. java mysql索引_如何理解并正确使用MySql索引

    1.概述 索引是存储引擎用于快速查找记录的一种数据结构,通过合理的使用数据库索引可以大大提高系统的访问性能,接下来主要介绍在MySql数据库中索引类型,以及如何创建出更加合理且高效的索引技巧. 注:这 ...

  7. mysql多列索引用处_MySQL索引使用说明(单列索引和多列索引)

    1. 单列索引 在性能优化过程中,选择在哪些列上创建索引是最重要的步骤之一.可以考虑使用索引的主要有两种类型的列:在Where子句中出现的列,在join子句中出现的列.请看下面这个查询: 这个查询与前 ...

  8. mysql聚集索引可以多列吗_MySQL使用单列索引和多列索引

    讨论MySQL选择索引时单列单列索引和多列索引使用,以及多列索引的最左前缀原则. 1. 单列索引 在性能优化过程中,选择在哪些列上创建索引是最重要的步骤之一.可以考虑使用索引的主要有两种类型的列:在W ...

  9. mysql索引_mysql系列:深入理解mysql 索引特性(屡试不爽的mysql索引总结)

    原标题:mysql系列:深入理解mysql 索引特性(屡试不爽的mysql索引总结) mysql为什么使用B+ Tree索引,不使用B- Tree索引? 索引顺序如何生效? 什么是覆盖索引? orde ...

最新文章

  1. python窗口程序-窗口程序python
  2. SQLAlchemy 用于 MySQL创建表时的bug修正
  3. Spring MVC中注解 @ModelAttribute
  4. 信息系统项目管理知识--项目范围管理
  5. fatal error: alsa/asoundlib.h: 没有那个文件或目录错误解决办法
  6. RabbitMQ安装方法 安装完成已验证方法步骤可行性
  7. UCloud裴志伟:最小价值模型,技术迭代与客户需求可以达成平衡
  8. Codeforces Round #446 (Div. 1) B. Gluttony 构造 + 补集思想
  9. 怎么在anaconda上安装python_我是如何用Anaconda来管理Python的
  10. 老项目引入masonry后报错unrecognized selector sent to instance
  11. git推送项目到码云(gitee)
  12. 设计模式(一)----简单工厂、工厂方法和抽象工厂区别
  13. 完全二叉树的叶子节点数公式_二叉树基础知识
  14. windows批处理脚本bat命令解析【12】ECHO处于关闭状态
  15. Codeforces 1023G:Pisces(最长反链)
  16. 基于STC89C52RC单片机制作的红外循迹小车(4个传感器)
  17. Netfilter源码分析(1)(ZT)
  18. IT行业中的互联网领域和软件领域工作方向有什么区别?
  19. Web网页设计之HTML_5. HTML 表格
  20. [Music]加州旅馆

热门文章

  1. 汇编和python-编程语言与Python介绍
  2. python流程控制语句-Python_流程控制语句
  3. c++强大还是python强大-Python 到底是强类型语言,还是弱类型语言?
  4. python开发工程师面试题-2019超实用Python开发工程师面试题分享
  5. 学python买什么书好-学python3什么书好
  6. python怎么画条形图-如何按python中的值分组绘制条形图?
  7. python和java一样吗-三分钟看懂Python和Java的区别
  8. python编程培训多少钱-python培训一般多少钱?[python培训]
  9. 用python画花瓣-Python——画一棵漂亮的樱花树
  10. python就业前景分析-Python就业前景如何?老男孩Python培训好吗?