zoukankan      html  css  js  c++  java
  • MySQL单列索引和组合索引(联合索引)的区别详解

    发现index merge局限性,优化器会自动判断是否使用 index merge 优化技术,查询还是需要组合索引【推荐阅读:对mysql使用索引的误解

    MySQL单列索引和组合索引(联合索引)的区别详解
    初始我写这篇文章的原因在于面试到一家大的游戏公司的时候,一个面试题
    大致的内容是怎么加速这个where a=’1′ 和 where a=’1′ and b=’2′,当时我答题的时候回答的是a加索引,a和b加联合索引。
    面试官跟我聊题目的时候说 where a=’1′ and b=’2′ 在加一个b的索引就好了,因为之前加过a的单列索引了,他很确定的告诉我,因为我没有测试过,所以没有反驳。在回去的路上我一直想不通,多个单列的索引和联合索引都一样的速度,联合索引还有什么用?
    今天有空来做个试验,当然之前我已经查过资料了,为了确定一下
    创建一个users表

    1. CREATE TABLE `users` (
    2. `userID` int(11) NOT NULL AUTO_INCREMENT,
    3. `userName` varchar(20) NOT NULL,
    4. `password` varchar(20) NOT NULL,
    5. PRIMARY KEY (`userID`)
    6. )

    创建一个genUsers存储过程,用来模拟数据

    1. delimiter $
    2. create procedure genUsers()
    3. begin
    4. declare i int default 0;
    5. while i < 100000 do
    6. set i = i + 1;
    7. insert into users(userID,userName,`password`) values(i,concat('username',i),concat('password',i));
    8. end while;
    9. end $
    10. delimiter ;

    执行存储过程

    1. call genUsers();

    复制表结构和数据

    1. CREATE TABLE users2 SELECT * FROM users;

    添加userName,password单列索引

    1. alter table users add index userName(userName);
    2. alter table users add index password(password);
    1. select * from users where userName like 'username65%' and password like 'password65%'; 执行时间0.06
    1. alter table users2 add index userName_password(userName,password);
    1. select * from users2 where userName like 'username65%' and password like 'password65%’;执行时间0.00秒

    上面的结果每台机子测试的结果可能有所不同
    原因是在mysql执行查询的时候,只能使用一个索引,mysql会选择一个最严格(获得结果集记录数最少)的索引。最左前缀:顾名思义,就是最左优先,打一比方
    alter table users add index lname_fname_age(lname,fname,age);
    创建了lname_fname_age多列索引,相当于创建了(lname)单列索引,(lname,fname)联合索引以及(lname,fname,age)联合索引。

    QQ交流群:136351212(满) 455721967

    如无特别说明,本站文章皆为原创,若要转载,务必请注明以下原文信息:
    转载保留版权:小松博客» MySQL单列索引和组合索引(联合索引)的区别详解
    本文链接地址:https://www.phpsong.com/586.html

  • 相关阅读:
    java 读取文件内容 方法
    Linux常见问题解答--如何修复“tar:Exiting with failure status due to previous errors”
    FTPbug
    linux shell 字符串操作(长度,查找,替换)详解
    mysqldump参数详细说明
    Win7下的内置FTP组件的设置详解
    FTPAPI
    Linux文件传输FTP详解
    linux 利用shell将当前时间写入文件
    IDEA下创建SpringBoot+MyBatis+MySql项目实现动态登录与注册功能
  • 原文地址:https://www.cnblogs.com/a8457013/p/8316398.html
Copyright © 2011-2022 走看看