问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

mysql 多列索引 怎么查询

发布网友 发布时间:2022-04-08 09:21

我来回答

2个回答

懂视网 时间:2022-04-08 13:42

mysql的多列索引是经常会遇到的问题,怎样才能有效命中索引,是本文要探讨的重点。

 

多列索引使用的Btree,也就是平衡二叉树。简单来说就是排好序的快速索引方式。它的原则就是要遵循左前缀索引。

多个索引从左边往右都使用上,才能使用到整个多列索引。

 

下面我先建立一个简单的表做实验:

create table t6 (

c1 char(1) not null default ‘‘,

c2 char(1) not null default ‘‘,

c3 char(1) not null default ‘‘,

c4 char(1) not null default ‘‘,

c5 char(1) not null default ‘‘,

key(c1,c2,c3,c4,c5)

) engine myisam charset utf8;

再分别insert into一些数据。

 

分别做以下一些查询:

1.

explain select * from t6 where c1=‘a‘ and c2=‘b‘ and c4>‘a‘ and c3="c" G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: t6
type: range
possible_keys: c1
key: c1
key_len: 12
ref: NULL
rows: 2
Extra: Using where
1 row in set (0.00 sec)

这里使用到了c1,c2,c3,c4索引,特别c4是一个范围查询,所以type为range,依次c1,c2,c3被命中索引。

2.

explain select * from t6 where c1=‘a‘ and c4=‘a‘ order by c3,c2 G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: t6
type: ref
possible_keys: c1
key: c1
key_len: 3
ref: const
rows: 2
Extra: Using where; Using filesort
1 row in set (0.00 sec)

过程中先命中了c1,然后在order by c3,c2的时候由于先去use c3做排序,从而联合索引断了。using filesort表明没有使用到多列合索引,而是做了文件内排序。

 

3.

explain select * from t6 where c1=‘a‘ and c4=‘a‘ order by c2,c3 G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: t6
type: ref
possible_keys: c1
key: c1
key_len: 3
ref: const
rows: 2
Extra: Using where
1 row in set (0.00 sec)

 

反之命中c1索引后,先用c2排序,再是c3来排序,分别命中,最后是c4=‘a‘做where查询,使用到了多列索引。

mysql之多列索引

标签:

热心网友 时间:2022-04-08 10:50

假如你有一个表,
SQL> CREATE TABLE test_tab (2 id INT,
3 name VARCHAR(10),
4 age INT,
5 val VARCHAR(10)6 );你的业务,有一个查询,是
SELECT * FROM test_tab WHERE name = 一个外部输入的数据
刚开始,数据不多的时候,执行效果还不错。
随着数据量的增加,这个查询,执行起来,越来越慢了。
然后在 name 上面 建立了索引
CREATE INDEX idx_test4_name ON test_tab (name );
这样, 可以加快前面那个查询的速度。
但是,某天,你执行了下面这个SQL, 发现速度又慢了
SELECT * FROM test_tab WHERE age = 25
为啥呢? 因为 age 字段上面,没有索引
索引只在 name 上面有
换句话说, 也就是 WHERE 里面的条件, 会自动判断,有没有 可用的索引,如果有, 该不该用。
多列索引,就是一个索引,包含了2个字段。
例如:CREATE INDEX idx_test_name_age ON test_tab (name, age);那么SELECT * FROM test_tabWHEREname LIKE '张%'
AND age = 25
这样的查询,将能够使用上面的索引。
多列索引,还有一个可用的情况就是, 某些情况下,可能查询,只访问索引就足够了, 不需要再访问表了。例如:SELECTAVG( avg ) AS 平均年龄FROMtest_tabWHEREname LIKE '张%'
这个时候, name 与 age 都包含在索引里面。 查询不需要去检索表中的数据。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
西宁出发经甘南、川西到云南自驾游最佳路线 有没有哪些摇滚比较好的女歌手? 王红都唱歌哪些歌曲? 王红是李春波的老婆吗? 周五买的基金周一有收益嘛? 成语:过隙白驹是什么意思?有什么样的典故和故事? 如何评价华语乐坛王菲,林忆莲,李玟,张惠妹,那英的唱功地位 如何评价王菲和李玟的性格对比?人生阅历有多大的不同? 李玟去世:广告语 ldquo 大家好才是真的好 rdquo 是不是李玟的作品? 地脚线用什么颜色的好 地脚线和什么颜色搭配 独木舟真的有16个耳洞吗? 真的很喜欢很爱她菠萝,很期待很盼望能早日开花结果的那一天的英文怎么写 enjoy every step是哪个鞋子的广告词 淘宝天猫oppo finder x907正品吗? 一件正版nba球衣多少钱 斯伯丁篮球好还是nike的球好 大博文飞跃是正品吗 在优动网买凯胜FORWARD 320和胜利9500的打完折都是199元靠谱吗? 双色球密码准确率99 22选5中奖规则 推荐一款好用的相机,1000-2000元左右的 数码相机哪种款式好呢 数码相机多少万象素可以满足? 请问大佬有完美候选人2019年上映的由Nora Al Awadh主演的高清视频在线观看资源吗 3d和值怎么玩 为什么MySQL多列索引的前导为date类型,不走索引 怎样把手机上的音乐拷到u盘里面 两岁宝宝消化不良医生说可以吃点水果,怎么给宝宝做果泥? 关于爱国电影的观后感 宝宝吃果泥需要蒸熟吗 本人身高181cm体重93KG我想了解怎么怎样能提高我的弹跳和启动速度和对抗能力{对抗能力真的不咱地} 真的彩金怕火烧么?会变黑么 真的不知道他为何如此神奇的英文 外星人是不是存在的,2012冬至那天的行星排成一条直线是不是真的。 PFS控制和PID控制,谁更有优势?PID时代真的要被PFS控制“终结”吗? “明天终于可以见到一年未见的你了,我真的很期待”的英语该怎样写(翻译) 求这篇的中文翻译~~速度~真的着急~ 我zinch裏面看到哈佛大学有国际学生奖学金是真的吗 黑道圣徒逃出地狱是正版的也是中文版的有什么作弊秘籍 您听说过江苏宿迁都有哪些特产呢? 脸部皮肤角质化怎么回事 洗脸后脸上有角质是什么原因 脸上起死皮 宿迁有哪些特色小吃呢? 脸上有死皮是什么原因 脸上有很多死皮是怎么回事 宿迁、 有什么好吃的 地方? 死皮是什么原因造成的? 脸上好多啊 脸上皮肤角质化了怎么办 脸上的死皮多是什么原因应该怎么办