8.3.5 Multiple-Column Indexes 多列索引
2015-08-26 10:10
134 查看
8.3.5 Multiple-Column Indexes 多列索引
MySQL 可以创建符合索引(索引在多列上),一个索引可以包含多大16个列,对于某些数据类型,你可以索引一个前缀列。
MySQL 可以使用多列索引用于查询,测试所有的列在索引里,或者 查询只测试第一列,头2列,头3列。
如果你指定 了正确的顺序在索引定义的时候,一个简单的符合索引能加速若干查询。
一个多列索引 被认为是一个已排序的数组, 索引中包含值的行
注意:
作为一个复合索引,你可以介绍基于其他列的被hash的列。如果这个列是短的,合理的唯一的,可以被索引的,
可能比宽的在很多列上的索引更快。 在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值的查询,因为last_name列是索引最左边前缀。
因此, name index 适用于下面的查询:
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 index 不能用于下面的查询:
SELECT * FROM test WHERE first_name=’Michael’;
SELECT * FROM test
WHERE last_name=’Widenius’ OR first_name=’Michael’;
假设 你执行下面的SELECT 语句:
SELECT * FROM tbl_name
WHERE col1=val1 AND col2=val2;
如果一个多列索引存在col1和col2上, 相应的记录可以直接取得。 如果一个单独的 单列索引在col1和col2,
优化器尝试使用index merge 优化,或者尝试找到最限定的索引通过确定哪个索引排除最多的行。
如果表中有多个列的索引,索引的最左前缀能用于通过优化器来查找记录。比如,
如果你有一个3列索引在(col1, col2, col3), 你可以通过索引搜索在 (col1), (col1, col2), and (col1, col2, col3).
MySQL 无法使用索引来执行查找 ,如果列不构成索引的最左前缀进行查找,假定您有此处显示的选择语句:
SELECT * 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;
如果一个index 存在于(col1, col2, col3), 只有前2个能使用索引, 第三个和第四个查询
确实涉及了索引列,但是t (col2) and (col2, col3) 不是索引的最左边列。
MySQL 可以创建符合索引(索引在多列上),一个索引可以包含多大16个列,对于某些数据类型,你可以索引一个前缀列。
MySQL 可以使用多列索引用于查询,测试所有的列在索引里,或者 查询只测试第一列,头2列,头3列。
如果你指定 了正确的顺序在索引定义的时候,一个简单的符合索引能加速若干查询。
一个多列索引 被认为是一个已排序的数组, 索引中包含值的行
注意:
作为一个复合索引,你可以介绍基于其他列的被hash的列。如果这个列是短的,合理的唯一的,可以被索引的,
可能比宽的在很多列上的索引更快。 在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值的查询,因为last_name列是索引最左边前缀。
因此, name index 适用于下面的查询:
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 index 不能用于下面的查询:
SELECT * FROM test WHERE first_name=’Michael’;
SELECT * FROM test
WHERE last_name=’Widenius’ OR first_name=’Michael’;
假设 你执行下面的SELECT 语句:
SELECT * FROM tbl_name
WHERE col1=val1 AND col2=val2;
如果一个多列索引存在col1和col2上, 相应的记录可以直接取得。 如果一个单独的 单列索引在col1和col2,
优化器尝试使用index merge 优化,或者尝试找到最限定的索引通过确定哪个索引排除最多的行。
如果表中有多个列的索引,索引的最左前缀能用于通过优化器来查找记录。比如,
如果你有一个3列索引在(col1, col2, col3), 你可以通过索引搜索在 (col1), (col1, col2), and (col1, col2, col3).
MySQL 无法使用索引来执行查找 ,如果列不构成索引的最左前缀进行查找,假定您有此处显示的选择语句:
SELECT * 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;
如果一个index 存在于(col1, col2, col3), 只有前2个能使用索引, 第三个和第四个查询
确实涉及了索引列,但是t (col2) and (col2, col3) 不是索引的最左边列。
相关文章推荐
- linux下kill多个进程
- caffe使用MemoryDataLayer从内存中加载数据
- 实现solr热词排行榜
- oracle时间函数
- noip2001 统计单词个数 (动态规划-划分)
- 《Python 3面向对象编程》试读笔记
- Protect Your Flash Files From Decompilers by Using Encryption
- 二叉树的遍历(一)
- 【VBA研究】EXCEL启动时自动启动窗体
- Windows下编译并使用libcurl.lib静态库
- 如何通过友盟分析发布后App崩溃日志
- Monitor线程操作(当一个线程中处于等待状态时,另外一个线程来解锁它的等待状态继续执行下去)
- TCP 与 UDP
- malloc/free和new/delete的区别
- [MFC学习笔记]--lesson12 文件操作
- UIButton 点击传递两个参数的实现
- python+django+fastcgi+nginx
- 【华为OJ平台练习题】Ascii码排序
- ASCII编码 和 UNICODE编码
- PS学习笔记-----合并图层