发布网友 发布时间:2022-04-26 02:10
共2个回答
热心网友 时间:2022-04-09 00:47
MySQL单列索引和组合索引的区别可能有很多人还不是十分的了解下面就为您分析两者的主要区别供您参考学习
为了形象地对比两者再建一个表
CREATE TABLE myIndex ( i_testID INT NOT NULL AUTO_INCREMENT vc_Name VARCHAR() NOT NULL vc_City VARCHAR() NOT NULL i_Age INT NOT NULLi_SchoolID INT NOT NULL PRIMARY KEY (i_testID) );
在这 条记录里面 上 下地分布了 条 vc_Name="erquan" 的记录只不过 cityageschool 的组合各不相同
来看这条 TSQLSELECT i_testID FROM myIndex WHERE vc_Name=erquanAND vc_City=郑州 AND i_Age=;
首先考虑建MySQL单列索引
在 vc_Name 列上建立了索引执行 TSQL 时MYSQL 很快将目标锁定在了 vc_Name=erquan 的 条记录上取出来放到一中间结果集在这个结果集里先排除掉 vc_City 不等于"郑州"的记录再排除 i_Age 不等于 的记录最后筛选出唯一的符合条件的记录
虽然在 vc_Name 上建立了索引查询时MYSQL不用扫描整张表效率有所提高但离我们的要求还有一定的距离同样的在 vc_City 和 i_Age 分别建立的MySQL单列索引的效率相似
为了进一步榨取 MySQL 的效率就要考虑建立组合索引就是将 vc_Namevc_Cityi_Age 建到一个索引里
ALTER TABLE myIndex ADD INDEX name_city_age (vc_Name()vc_Cityi_Age);
建表时vc_Name 长度为 这里为什么用 呢?因为一般情况下名字的长度不会超过 这样会加速索引查询速度还会减少索引文件的大小提高 INSERT 的更新速度
执行 TSQL 时MySQL 无须扫描任何记录就到找到唯一的记录!!
肯定有人要问了如果分别在 vc_Namevc_Cityi_Age 上建立单列索引让该表有 个单列索引查询时和上述的组合索引效率一样吗?大不一样远远低于我们的组合索引虽然此时有了三个索引但 MySQL 只能用到其中的那个它认为似乎是最有效率的单列索引
建立这样的组合索引其实是相当于分别建立了
vc_Namevc_Cityi_Age
vc_Namevc_City
vc_Name
这样的三个组合索引!为什么没有 vc_Cityi_Age 等这样的组合索引呢?这是因为 mysql 组合索引“最左前缀”的结果简单的理解就是只从最左面的开始组合并不是只要包含这三列的查询都会用到该组合索引下面的几个 TSQL 会用到
SELECT * FROM myIndex WHREE vc_Name="erquan" AND vc_City="郑州"
SELECT * FROM myIndex WHREE vc_Name="erquan"
而下面几个则不会用到
SELECT * FROM myIndex WHREE i_Age= AND vc_City="郑州"
SELECT * FROM myIndex WHREE vc_City="郑州"
转载,仅供参考。
热心网友 时间:2022-04-09 02:05
MySQL单列索引和组合索引的区别可能有很多人还不是十分的了解下面就为您分析两者的主要区别供您参考学习
为了形象地对比两者再建一个表
CREATE TABLE myIndex ( i_testID INT NOT NULL AUTO_INCREMENT vc_Name VARCHAR() NOT NULL vc_City VARCHAR() NOT NULL i_Age INT NOT NULLi_SchoolID INT NOT NULL PRIMARY KEY (i_testID) );
在这 条记录里面 上 下地分布了 条 vc_Name="erquan" 的记录只不过 cityageschool 的组合各不相同
来看这条 TSQLSELECT i_testID FROM myIndex WHERE vc_Name=erquanAND vc_City=郑州 AND i_Age=;
首先考虑建MySQL单列索引
在 vc_Name 列上建立了索引执行 TSQL 时MYSQL 很快将目标锁定在了 vc_Name=erquan 的 条记录上取出来放到一中间结果集在这个结果集里先排除掉 vc_City 不等于"郑州"的记录再排除 i_Age 不等于 的记录最后筛选出唯一的符合条件的记录
虽然在 vc_Name 上建立了索引查询时MYSQL不用扫描整张表效率有所提高但离我们的要求还有一定的距离同样的在 vc_City 和 i_Age 分别建立的MySQL单列索引的效率相似
为了进一步榨取 MySQL 的效率就要考虑建立组合索引就是将 vc_Namevc_Cityi_Age 建到一个索引里
ALTER TABLE myIndex ADD INDEX name_city_age (vc_Name()vc_Cityi_Age);
建表时vc_Name 长度为 这里为什么用 呢?因为一般情况下名字的长度不会超过 这样会加速索引查询速度还会减少索引文件的大小提高 INSERT 的更新速度
执行 TSQL 时MySQL 无须扫描任何记录就到找到唯一的记录!!
肯定有人要问了如果分别在 vc_Namevc_Cityi_Age 上建立单列索引让该表有 个单列索引查询时和上述的组合索引效率一样吗?大不一样远远低于我们的组合索引虽然此时有了三个索引但 MySQL 只能用到其中的那个它认为似乎是最有效率的单列索引
建立这样的组合索引其实是相当于分别建立了
vc_Namevc_Cityi_Age
vc_Namevc_City
vc_Name
这样的三个组合索引!为什么没有 vc_Cityi_Age 等这样的组合索引呢?这是因为 mysql 组合索引“最左前缀”的结果简单的理解就是只从最左面的开始组合并不是只要包含这三列的查询都会用到该组合索引下面的几个 TSQL 会用到
SELECT * FROM myIndex WHREE vc_Name="erquan" AND vc_City="郑州"
SELECT * FROM myIndex WHREE vc_Name="erquan"
而下面几个则不会用到
SELECT * FROM myIndex WHREE i_Age= AND vc_City="郑州"
SELECT * FROM myIndex WHREE vc_City="郑州"