mysql5.7官网直译优化和索引--多列索引
来源:互联网 发布:cc攻击 linux 编辑:程序博客网 时间:2024/06/05 10:45
8.3.5 Multiple-Column indexes 多列索引。
mysql能够创建一个综合索引(也就是,索引在多个列上)。一个索引最多可以由16列组成。对于确定的数据类型,你能够索引一个列的前缀(具体请看8.3.4的索引列)。
mysql能够使用多列索引在查询中判断出现在索引中的所有列,或者是查询只判断第一列,第一二列,第一到三列,等等。如果你定义了特别的列顺序在索引中,那么一个简单的综合索引能够帮助你提高在同一张表中的多种查询。
一个多列索引可以被认为是一个有序数组,有值的行数据通过联系被索引的列的值而创建。
注意:
作为一个备选对组合索引,你能够提出一个列,该列是基于其他列信息的哈希。如果这列是合理的,短小的,唯一的,被索引的,它的速度回比一个宽索引在多个列上更快。在mysql,很容易使用这种额外的列:
SELECT * FROM tbl_name
WHERE hash_col=MD5(CONCAT(val1,val2))
AND col1=val1 AND col2=val2;
假设一张表有如下的规格:
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)
);
name索引是一个覆盖了列last_name和first_name的索引。索引能够被用于执行查询,特别是通过联合last_name和first_name列值的范围查询。它也能用于查询仅仅是last_name值的查询,因为该列是索引的最左前列(这部分之后会描述)。因此,name索引被用在如下的查询中:
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';
但是name索引不能用于如下形式的查询:
SELECT * FROM test WHERE first_name='Michael';
SELECT * FROM test
WHERE last_name='Widenius' OR first_name='Michael';
假如你的查询是如下的语句:
SELECT * FROM tbl_name
WHERE col1=val1 AND col2=val2;
如果多列索是在col1和col2上,那么匹配的行将会直接查出。如果独立的单列索引存在col1和col2上,优化器器会试着使用索引合并优化(具体看8.2.1.3的索引优化合并),或者是尝试找到最严肃索引来决定哪一个索引包含更多的行并使用索引查找行数据。
如果表有一个多列索引,任何左前缀索引都能够被优化器用来查找行。例如,如果你有一个三列索引在(col1,col2,col3),你能够索引查询在(col1),(col1,col2)和(col1,col2,col3).
mysql不能使用索引来优化查询,如果查询列不是一个索引左前缀的形式的话。假设你有查询语句如下:
ELECT * FROM tbl_name WHERE col1=val1;
SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;
SELECT * FROM tbl_name WHERE col2=val2;
SELECT * FROM tbl_name WHERE col2=val2 AND col3=val3;
如果一个索引存在(col1,col2,col3),只有第一二个查询能够使用索引。第三和第四查询确实涉及到了索引列,但是因为(col2)和(col2,col3)不是索引(col1,col2,col3)的左前缀,素银不能使用索引。
到此关于多列索引的使用就结束了,接下来我们要说的是8.3.6Verifying Index Usage
------------------------------------
8.3.6Verifying Index Usage 检验索引的使用
检查你的全部查询是否使用了你在表中创建的索引,使用EXPLAIN语句,具体描述在8.8.1的使用EXPLAIN来优化查询。
mysql能够创建一个综合索引(也就是,索引在多个列上)。一个索引最多可以由16列组成。对于确定的数据类型,你能够索引一个列的前缀(具体请看8.3.4的索引列)。
mysql能够使用多列索引在查询中判断出现在索引中的所有列,或者是查询只判断第一列,第一二列,第一到三列,等等。如果你定义了特别的列顺序在索引中,那么一个简单的综合索引能够帮助你提高在同一张表中的多种查询。
一个多列索引可以被认为是一个有序数组,有值的行数据通过联系被索引的列的值而创建。
注意:
作为一个备选对组合索引,你能够提出一个列,该列是基于其他列信息的哈希。如果这列是合理的,短小的,唯一的,被索引的,它的速度回比一个宽索引在多个列上更快。在mysql,很容易使用这种额外的列:
SELECT * FROM tbl_name
WHERE hash_col=MD5(CONCAT(val1,val2))
AND col1=val1 AND col2=val2;
假设一张表有如下的规格:
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)
);
name索引是一个覆盖了列last_name和first_name的索引。索引能够被用于执行查询,特别是通过联合last_name和first_name列值的范围查询。它也能用于查询仅仅是last_name值的查询,因为该列是索引的最左前列(这部分之后会描述)。因此,name索引被用在如下的查询中:
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';
但是name索引不能用于如下形式的查询:
SELECT * FROM test WHERE first_name='Michael';
SELECT * FROM test
WHERE last_name='Widenius' OR first_name='Michael';
假如你的查询是如下的语句:
SELECT * FROM tbl_name
WHERE col1=val1 AND col2=val2;
如果多列索是在col1和col2上,那么匹配的行将会直接查出。如果独立的单列索引存在col1和col2上,优化器器会试着使用索引合并优化(具体看8.2.1.3的索引优化合并),或者是尝试找到最严肃索引来决定哪一个索引包含更多的行并使用索引查找行数据。
如果表有一个多列索引,任何左前缀索引都能够被优化器用来查找行。例如,如果你有一个三列索引在(col1,col2,col3),你能够索引查询在(col1),(col1,col2)和(col1,col2,col3).
mysql不能使用索引来优化查询,如果查询列不是一个索引左前缀的形式的话。假设你有查询语句如下:
ELECT * FROM tbl_name WHERE col1=val1;
SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;
SELECT * FROM tbl_name WHERE col2=val2;
SELECT * FROM tbl_name WHERE col2=val2 AND col3=val3;
如果一个索引存在(col1,col2,col3),只有第一二个查询能够使用索引。第三和第四查询确实涉及到了索引列,但是因为(col2)和(col2,col3)不是索引(col1,col2,col3)的左前缀,素银不能使用索引。
到此关于多列索引的使用就结束了,接下来我们要说的是8.3.6Verifying Index Usage
------------------------------------
8.3.6Verifying Index Usage 检验索引的使用
检查你的全部查询是否使用了你在表中创建的索引,使用EXPLAIN语句,具体描述在8.8.1的使用EXPLAIN来优化查询。
阅读全文
0 0
- mysql5.7官网直译优化和索引--多列索引
- mysql5.7官网直译优化和索引--使用生成列的索引
- mysql5.7官网直译优化和索引--主键优化
- mysql5.7官网直译优化和索引--mysql如何使用索引
- mysql5.7官网直译优化和索引--索引统计的收集
- mysql5.7官网直译优化和索引--使用索引扩展
- mysql5.7官网直译优化和索引--B树索引和哈希索引的对比
- mysql5.7官网直译SQL语句优化--索引合并的优化
- mysql5.7官网直译SQL语句优化--索引条件压入优化
- mysql5.7官网直译SQL语句优化--排序优化
- mysql5.7官网直译SQL语句优化--分组优化
- mysql5.7官网直译数据结构优化--数据大小优化
- mysql5.7官网直译SQL语句优化--派生表和试图引用的优化
- mysql5.7官网直译SQL语句优化--多范围读取优化
- mysql5.7官网直译SQL语句优化--子查询,派生表和试图引用
- mysql5.7在多列索引 in条件查询的优化
- mysql5.7官网直译SQL语句优化--块式嵌套循环和批量key访问连接
- mysql5.7官网直译SQL语句优化--select语句优化
- Mycat分库分表的简单实践 / 用Mycat,学会数据库读写分离、分表分库
- Ubuntu16.04搭建Kaldi
- 旅游回来
- angularJS过滤器+自定义
- Qt 界面获取键盘Enter键
- mysql5.7官网直译优化和索引--多列索引
- Swagger
- Shader的学习方法总结
- 这句话一说,十万人立刻请愿白宫逼他辞职
- 搜狐科技:给最会玩手机的人发钱了!
- 智能家居来了,未来的你需要一个会思考的房子
- 图像与机器学习-3-特征
- 报表FBL3N中需要增加BKPF或者BSEG表的字段,不要慌,轻松一步。 方法一: 方法二:
- Mysql数据库几种搜索引擎