› 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 · Jul 14, 2018 · 5442 views
    This topic created in 2995 days ago, the information mentioned may be changed or developed.
    表
    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 replies  •  2018-07-15 17:47:27 +08:00
    zooo
        1
    zooo  
    OP
       Jul 14, 2018
    执行结果:后一条,查询到了数据,没有使用索引,而前一条使用没有查询到数据,使用了索引。
    haiyang416
        2
    haiyang416  
       Jul 14, 2018 via Android
    看样子是覆盖索引相关的内容,需要确认两条查询里都是 last_name ?
    zooo
        3
    zooo  
    OP
       Jul 14, 2018
    @haiyang416 刚看了下,书上 说 : 如果一个索引包含(或者说覆盖)所有需要查询的字段的值,就称为覆盖索引。
    但我这里 查询 * 还包括了 gerder 字段,那就应该不是覆盖索引了吧?
    haiyang416
        4
    haiyang416  
       Jul 14, 2018 via Android
    @zooo 我的意思是检查下两条查询条件是不是都是 last_name,有没有 first_name,看是不是左前匹配。覆盖索引是说书的章节,估计记错了,请忽略。
    pathbox
        5
    pathbox  
       Jul 14, 2018 via iPhone
    你数据是怎样的没有说
    zooo
        6
    zooo  
    OP
       Jul 14, 2018
    @pathbox 和数据量和数据内容有关系?不懂,求教
    zooo
        7
    zooo  
    OP
       Jul 14, 2018
    @haiyang416 查询条件都是 WHERE last_name
    glacer
        8
    glacer  
       Jul 14, 2018 via iPhone
    应该是你的数据里没有 A 开头的,我记得要是没有命中索引的数据,执行计划是显示全表的。
    carlclone
        9
    carlclone  
       Jul 14, 2018 via Android   ❤️ 1
    和数据量跟内容会有关系,涉及到优化器的东西,比如表太小直接就顺序查找,不走索引
    eslizn
        10
    eslizn  
       Jul 14, 2018
    不存在的,看看你的 Extra
    Raymon111111
        11
    Raymon111111  
       Jul 14, 2018   ❤️ 1
    区分度的问题

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

    @Raymon111111 嗯,之前也有人这么说,那应该是这样了,A***数据占数据表大部分,所以就不用走索引的
    Raymon111111
        13
    Raymon111111  
       Jul 14, 2018
    @zooo 数据太少了, 至少几万再想索引的事吧
    zooo
        14
    zooo  
    OP
       Jul 14, 2018
    zooo
        15
    zooo  
    OP
       Jul 14, 2018
    谢谢各位回答
    xiaoxlm
        16
    xiaoxlm  
       Jul 15, 2018
    查询优化器会根据数据量判断要不要用索引
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2422 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 01:02 · PVG 09:02 · LAX 18:02 · JFK 21:02
    ♥ Do have faith in what you're doing.