V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
zooo
V2EX  ›  MySQL

高性能 MySQL 中索引的问题?

  •  
  •   zooo · 2018-07-14 07:24:58 +08:00 · 4307 次点击
    这是一个创建于 2311 天前的主题,其中的信息可能已经有所发展或是发生改变。

    CREATE TABLE People (
    last_name VARCHAR(50) NOT NULL,
    first_name VARCHAR(50) NOT NULL,
    dob DATE NOT NULL,
    gender ENUM('m', 'f') NOT NULL,
    KEY(last_name, first_name, dob)
    );
    EXPLAIN SELECT * FROM high_performance_mysql.People WHERE last_name LIKE 'J%';
    EXPLAIN SELECT * FROM high_performance_mysql.People WHERE last_name LIKE 'A%';
    为什么这两个查询语句,一个使用到了索引,一个没有使用索引? 仅仅就是 LIKE 后面改了
    16 条回复    2018-07-15 17:47:27 +08:00
    zooo
        1
    zooo  
    OP
       2018-07-14 07:26:15 +08:00
    执行结果:后一条,查询到了数据,没有使用索引,而前一条使用没有查询到数据,使用了索引。
    haiyang416
        2
    haiyang416  
       2018-07-14 07:29:12 +08:00 via Android
    看样子是覆盖索引相关的内容,需要确认两条查询里都是 last_name ?
    zooo
        3
    zooo  
    OP
       2018-07-14 07:41:00 +08:00
    @haiyang416 刚看了下,书上 说 : 如果一个索引包含(或者说覆盖)所有需要查询的字段的值,就称为覆盖索引。
    但我这里 查询 * 还包括了 gerder 字段,那就应该不是覆盖索引了吧?
    haiyang416
        4
    haiyang416  
       2018-07-14 07:48:45 +08:00 via Android
    @zooo 我的意思是检查下两条查询条件是不是都是 last_name,有没有 first_name,看是不是左前匹配。覆盖索引是说书的章节,估计记错了,请忽略。
    pathbox
        5
    pathbox  
       2018-07-14 08:40:42 +08:00 via iPhone
    你数据是怎样的没有说
    zooo
        6
    zooo  
    OP
       2018-07-14 08:59:17 +08:00
    @pathbox 和数据量和数据内容有关系?不懂,求教
    zooo
        7
    zooo  
    OP
       2018-07-14 09:00:13 +08:00
    @haiyang416 查询条件都是 WHERE last_name
    glacer
        8
    glacer  
       2018-07-14 09:04:11 +08:00 via iPhone
    应该是你的数据里没有 A 开头的,我记得要是没有命中索引的数据,执行计划是显示全表的。
    carlclone
        9
    carlclone  
       2018-07-14 09:08:21 +08:00 via Android   ❤️ 1
    和数据量跟内容会有关系,涉及到优化器的东西,比如表太小直接就顺序查找,不走索引
    eslizn
        10
    eslizn  
       2018-07-14 09:12:50 +08:00
    不存在的,看看你的 Extra
    Raymon111111
        11
    Raymon111111  
       2018-07-14 20:34:58 +08:00   ❤️ 1
    区分度的问题

    比如你数据库里几乎所有的数据都 A****, 那走不走 A 这个索引对查询几乎毫无帮助, 那么就会直接判定不走这个索引了
    zooo
        12
    zooo  
    OP
       2018-07-14 20:43:24 +08:00
    @glacer A 开头的有 8 条,没有走索引,而 J 开头的没有数据,走索引了。

    @Raymon111111 嗯,之前也有人这么说,那应该是这样了,A***数据占数据表大部分,所以就不用走索引的
    Raymon111111
        13
    Raymon111111  
       2018-07-14 21:05:51 +08:00
    @zooo 数据太少了, 至少几万再想索引的事吧
    zooo
        14
    zooo  
    OP
       2018-07-14 21:18:13 +08:00
    zooo
        15
    zooo  
    OP
       2018-07-14 21:18:24 +08:00
    谢谢各位回答
    xiaoxlm
        16
    xiaoxlm  
       2018-07-15 17:47:27 +08:00
    查询优化器会根据数据量判断要不要用索引
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2757 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 08:54 · PVG 16:54 · LAX 00:54 · JFK 03:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.