机器人论坛
直播中

杨诗琪

7年用户 199经验值
私信 关注
[问答]

谁能详细介绍一下mysql索引吗?

索引的基本命令
执行计划分析
索引应用规范
联合索引的key_len计算方式

回帖(5)

张锐

2020-11-10 11:29:00
索引的基本命令:
  1.1 查询索引,   show index  from 表名
  1.2 创建索引(单列的辅助索引)  : alter table 表名 add index idx_name(name)    ###name指的是要将表中的那个字段设置位索引    , idx_name :这个是先创建的索引名
  1.3 创建联合索引:alter table 表名 add index idx_c_P(countrycode,population);    #####括号里面指的是多个字段
  1.4 创建唯一索引:alter table 表名 add unique index uidx_dis(district);
  1.5 创建前缀索引:alter table 表名 add index idx_dis(district(5))
  1.6 删除索引:alter table city  drop index  索引名;
举报

汪佳丽

2020-11-10 11:29:39
压力测试语句:
mysqlslap
举报

张翔

2020-11-10 11:30:05
执行计划分析:
  使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈。
  3.1作用

  • 表的读取顺序
  • 数据读取操作的操作类型
  • 哪些索引可以使用
  • 哪些索引被实际使用
  • 表之间的引用
  • 每张表有多少行被优化器查询
  3.2 获取执行计划命令:
    explain sql 语句  
mysql> explain select * from Customers;            +----+-------------+-----------+------+---------------+------+---------+------+------+-------+            | id | select_type | table     | type | possible_keys | key  | key_len | ref  | rows | Extra |            +----+-------------+-----------+------+---------------+------+---------+------+------+-------+            |  1 | SIMPLE      | Customers | ALL  | NULL          | NULL | NULL    | NULL |    5 | NULL  |            +----+-------------+-----------+------+---------------+------+---------+------+------+-------+  3.3 分析执行计划
    3.3.1 table:表名
    3.3.2 type:查询的类型:1.全表扫描 :all  2.索引扫描: index , range, ref,eq_ref,const(system),null 从左到右性能变好

      index:全索引扫描,
      range:索引范围扫描
      ref:辅助索引等值查询
    select * from city where countrycode='CHN'
    union all
    select * from city where countrycode='USA';

    eq_ref:多表连接时,子表使用主键列或唯一列列作为连接条件
    const(system) :主键或者唯一键的等值查询
    select * from city where id=100;

    3.3.3 possible_keys:可能会用到的索引
       key:真正选择了哪个索引
       key_len  索引覆盖长度
举报

杨芳

2020-11-10 11:30:17
索引应用规范:
4.1建立索引的原则(DBA运维规范)
(1)建表必须要有主键,一般是无关列,自增长
(2)经常做where条件列,order by group by join on,distinct的条件
(3)最好使用唯一值多的列作为联合索引前导列,其他的按照联合索引优化细节来做
(4)列值长度较长的索引列,我们建议使用前缀索引
(5)降低索引条目,一方便不要创建没有索引,不常使用的索引清理,percona toolkit(xxxxxxxx)
(6)索引维护要避开业务繁忙器
(7)小表不建索引

4.2 不走索引的情况(开发规范)
(1)没有查询条件,或者查询条件没有建立索引
(2)查询结果集是原表中的大部分数据,应该是25%以上,
(3)索引本身失效,统计数据不真实
(4)查询条件使用函数在索引列上,或者对索引列进行运算,包括(+,-,*,/,!等)
(5)隐式转换导致索引失效
(6)<>,not in 不走索引(辅助索引)
(7)like "%aa" 百分号在最前面不走
(8)联合索引
举报

赵竞

2020-11-10 11:30:30
联合索引的key_len计算方式
  1 所有的索引字段,如果没有设置not null,则需要加一个字节。
  2.定长字段,int占四个字节,bigint占八个字、char(n)占n个字符。

  3 DATE 3 个字节 DATETIME 8 个字节 TIMESTAMP 4 个字节
  4.对于变成字段varchar(n),则有n个字符+两个字节。
  5.不同的字符集,一个字符占用的字节数不同。latin1编码的,一个字符占用一个字节,gbk编码的,一个字符占用两个字节,utf8编码的,一个字符占用三个字节 utf8mb4编码的,一个字符占用4个字节

  6 key_len只指示了where中用于条件过滤时被选中的索引列,是不包含order by/group by这一部分被选中的索引列的,所以可能存在排序用到索引但是key_len不对等的情况,这里要注意
  INNODB的索引会限制单独Key的最大长度为767字节,联合索引的单列项同样如此
举报

更多回帖

发帖
×
20
完善资料,
赚取积分