MySQL添加、修改、删除索引以及索引的使用场景

MySQL添加、修改、删除索引以及索引的使用场景索引是查询优化最主要的方式 查询方式 一种是 全表扫描 一种是 利用数据表上建立的所以进行扫描 1 索引类型分类 UNIQUE 唯一索引 不可以出现相同的值 可以有 NULL 值 加快查询速度 并且可以限制列值的唯一性 允许为空 唯一索引包括联合唯一索引 多列形成的唯一索引 这些列可以唯一确定一条表记录 可以为空 INDEX 普通索引 允许出现相同的索引内容 加快查询速度 PROMARYKEY 主键索引 不允许出现相同的值 主键

索引是查询优化最主要的方式;

查询方式:

  一种是:全表扫描;

  一种是:利用数据表上建立的所以进行扫描。

1.索引类型分类

  • UNIQUE(唯一索引):不可以出现相同的值,可以有NULL值;(

       加快查询速度,并且可以限制列值的唯一性,允许为空

            唯一索引包括联合唯一索引,多列形成的唯一索引,这些列可以唯一确定一条表记录,可以为空

  • INDEX(普通索引):允许出现相同的索引内容;(加快查询速度)
  • PROMARY KEY(主键索引):不允许出现相同的值;(主键唯一性,加快查询速度,不能为空)
  • fulltext index(全文索引):可以针对值中的某个单词,但效率确实不敢恭维;(主要针对文本的内容进行分词,加快查询速度)
  • 组合索引:实质上是将多个字段建到一个索引里,列值的组合必须唯一;(多列组成的索引,查询效率提升高于多个单列索引合并的效率)

2.索引结构分类

索引有很多分类,例如B-tree索引,哈希索引,全文索引等等,索引的实现是在存储引擎层,并不是在后端服务器层,所以不同的存储引擎支持的索引结构也不一定一样

  •  B-tree索引

     B-tree 索引普遍存在于存储引擎中,他使用B-tree数据结构来存储数据,如果对树形数据结构比较了解的话,就知道B-tree索引所带来的好处了,他的每个叶子节点都会包含下一个节点的指针,非常方便查询数据

     B-tree 适用于全键值,键值范围,或者前缀查找

  • 哈希索引

     哈希索引基于哈希表实现,对于每一行数据,存储引擎会对所有的索引列计算一个哈希码,然后存储引擎会基于这个哈希码来查找数据,小编感觉有点像HashMap 中槽的查询过程

  •   全文索引

     全文索引在几种索引结构类型中比较特殊,他查找的是文本中关键词

3. 用 alter table 语句创建索引

应用于表创建完毕之后再添加;

  • alter table 可用于创建普通索引、UNIQUE索引和PRIMARY KEY索引3种索引格式,
  • table_name是要增加索引的表名,
  • column_list指出对哪些列进行索引,多列时各列之间用逗号分隔。
  • 索引名index_name可选,缺省时,MySQL将根据第一个索引列赋一个名称。
  • 另外,ALTER TABLE允许在单个语句中更改多个表,因此可以同时创建多个索引。
 ALTER TABLE 表名 ADD 索引类型 (unique,primary key,fulltext,index)[索引名](字段名); 
-- 普通索引 alter table table_name add index index_name (column_list) ; -- 唯一索引 alter table table_name add unique (column_list) ; -- 主键索引 alter table table_name add primary key (column_list) ;

4.用 create index 语句创建索引

  • CREATE INDEX可用于对表增加普通索引或UNIQUE索引,可用于建表时创建索引
  • 如果是CHAR,VARCHAR类型,length可以小于字段实际长度;
  • 如果是BLOB和TEXT类型,必须指定 length
CREATE INDEX index_name ON table_name(username(length));  
-- create只能添加这两种索引; CREATE INDEX index_name ON table_name (column_list) CREATE UNIQUE INDEX index_name ON table_name (column_list) -- 为表my_text中的列name创建普通索引名称index_n create index index_n on my_test(name); -- 为age做降序索引 create index index_age on my_test(age DESC); -- #建立表列age和name的联合索引;按照age升序后再按照name降序排序 create index index_age_name on my_test(age,name DESC);

4.删除索引

删除索引可以使用ALTER TABLEDROP INDEX语句来实现;

drop index index_name on table_name ; 
alter table table_name drop index index_name ; alter table table_name drop primary key ;

5.修改索引

修改索引可以使用先删除再添加来实现;

--修改索引 alter table my_test drop index index_name;--删除索引 alter table my_test add index index_name(column_name);

 

6. 索引的正确使用

    索引是建立在系统文件上的,会占用一定的内存空间,另外数据在更新的时候也会去维护索引,消耗内存,所以索引一定要正确的使用,索引并不是越多越好,要根据具体的查询业务来规划索引的建立。

建议不要使用索引的几种情况:

    1. 区分度不是很大的字段,例如 性别 sex

    2. 频繁更新的字段

    3. 字符串类型的字段 或者 文本类型的字段

    4. 不在where列中出现的索引

索引失效的几种情况:

    1. 查询列中有函数计算 

    2. 查询列中有模糊查询,”%cloum”,可以使用”cloum%” 代替,如果要使用”%column%”,那么select 列中是索引列

    3. 如果查询条件中有or, 索引会失效,除非所有条件都加上索引

    4. 使用不等于(!= 或者 <>)

    5. is null 或者 is not null

    6. 字符串不加引号,会导致索引失效

    7. 最左原则,联合索引中会遵循最左原则,即如果要使用联合索引,那么前面的索引列一定要包含,举个例子,

       有个联合索引(a,b,c) 那么查询条件中只能是 a=1 或者 a=1 and b=1 或者 a=1 and b=1 and c=1,不然索引就会失效

7. 慢查询日志

    慢查询日志是指 mysql中查询 时间超过固定阈值的查询记录,默认时间是10秒,mysql默认情况下不开启慢查询

    默认:show variables like “%slow_query_log%”

 手动开启 set global 变量名 = 值

 set global slow_query_log = on ; 手动开启慢查询日志  set global long_query_time = 10; 手动设定查询时间超过的值,超过就会记录查询日志  set global slow_query_log_file = "/var/slow_log.log"; 手动设定慢查询日志的记录地址  set global log_queries_not_using_indexs = on ; 手动设定 是否要记录 查询中使用到索引的记录

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/222259.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午4:12
下一篇 2026年3月17日 下午4:12


相关推荐

  • 如何利用matlab做BP神经网络分析(包括利用matlab神经网络工具箱)「建议收藏」

    利用MATLAB进行BP神经网络的预测(含有神经网络工具箱)最近一段时间在研究如何利用预测其销量个数,在网上搜索了一下,发现了很多模型来预测,比如利用回归模型、时间序列模型,GM(1,1)模型,可是自己在结合实际的工作内容,发现这几种模型预测的精度不是很高,于是再在网上进行搜索,发现神经网络模型可以来预测,并且有很多是结合时间序列或者SVM(支持向量机)等组合模型来进…

    2022年4月11日
    66
  • 如何做好数据安全治理「建议收藏」

    如何做好数据安全治理「建议收藏」  数据安全问题贯穿数据全生命周期的各个环节。在新形势下,要做好数据安全治理,就要做好企业的数据安全防护能力建设,建立起一个强保障且动态化的安全保护机制。这个机制的攻坚点主要是三个方面:完善数据安全治理规划,提高数据安全技术防护能力,和加强数据安全审计。  1.完善数据安全治理规划  (1)评估数据安全现状  一般来说,组织进行数据安全治理的目标主要是两个:一是实现组织的合规保障;二是实现数据的充分开发利用,在安全的基础上谋发展。组织在进行数据安全治理时,应在这两个大方向的指引下,对组织内部的数

    2022年5月18日
    41
  • 腾讯混元-TurboS:首个混合Transformer-Mamba MoE超大模型来了

    腾讯混元-TurboS:首个混合Transformer-Mamba MoE超大模型来了

    2026年3月13日
    2
  • wireshark中抓取ICMP报文「建议收藏」

    wireshark中抓取ICMP报文「建议收藏」为了更有效地转发IP数据报和提高交付成功的机会,在网络层使用了网际控制报文协议ICMP(InternetControlMessageProtocol)[RFC792]。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。ICMP报文作为IP层数据报的数据,加上数据报的首部,组成数据报发送出去。ICMP报文的种类有两种,即ICMP差错报告报文和ICMP询问报文…

    2022年4月30日
    459
  • [MFC美化] MFC界面UI库总结

    [MFC美化] MFC界面UI库总结稍微说下自己用过的感受:1.SkinMagic动态库DLL使用,(有VC6版本的静态链接库,没能成功调用)。对控件:菜单和下拉框(下拉滚动条)有问题。不能自由设置颜色背景皮肤格式:.smf,可使

    2022年7月1日
    28
  • WdatePicker使用方法

    WdatePicker使用方法转载 https www cnblogs com goloving p 7163697 html 只需要引入 js 文件即可 自己试了个小实例 复制代码 DOCTYPE tml 会员名 出生日期 复制代码 其中 class Wdate 加与不加 会在页面上有所差异 加上 class 的如图示会有个时间的小图

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号