[转帖]MySQL联合索引(复合索引)

mysql,联合,索引,复合 · 浏览次数 : 0

小编点评

**添加联合索引 alter table 表名 add unique index (字段1,字段2)`** 当在插入相同数据时,使用联合索引时,会报错,因为联合索引在两个字段都存在唯一,该会导致索引中的数据量增加,索引查询效率降低。 **解决方法:** 可以使用**no duplicate key update** 解决相同数据不存储,不会报错的方法: ```sql insert into 表名 (name, age, time) values('zhangsan', '18', '2001:10:10') on duplicate keyupdate name = values(name), age = values(age) ``` **联合索引的优点:** * 若多个一条 SQL,需要多个用到两个条件的 SELECT 语句时,可以利用联合索引提高效率。 * 联合索引的体积比单独索引的体积要小,而且只是一个索引树,相比单独列的索引要更加的节省时间复杂度和空间复杂度。 **联合索引的wahati:** * 当创建 (col1, col2, col3)联合索引时,相当于创建了 (col1) 单列索引,(col1, col2) 联合索引以及 (col1, col2, col3) 联合索引想要索引生效,只能使用 col1 和 col1, col2 和 col1, col2, col3 三种组合。 * 当然,col1, col3 组合也可以,但实际上只用到了 col1 的索引,col3 并没有用到!

正文

Mysql联合唯一索引添加相同数据插入报错

联合索引在两个字段都存在唯一,将报错。

1.添加联合索引

alter table "表名" add unique index(`字段1`,`字段2`)

    2.此时如果在插入相同的数据会报错,可以使用 no duplicate key update 解决相同数据不存储,不会报错

    insert into "表名" (`name`,`age`,`time`)values('zhangsan','18','2001:10:10') on duplicate key
    update `name`=values(`name`),`age`=values(`age`)
    

      联合索引

      本文中联合索引的定义为(MySQL):

      ALTER TABLE `table_name` ADD INDEX (`col1`,`col2`,`col3`);
      

        联合索引的优点

        若多个一条SQL,需要多个用到两个条件

        SELECT * FROM `user_info` WHERE username='XX',password='XXXXXX';
        

          当索引在检索 password 字段的时候,数据量大大缩小,索引的命中率减小,增大了索引的效率。

          符合索引的索引体积比单独索引的体积要小,而且只是一个索引树,相比单独列的索引要更加的节省时间复杂度和空间复杂度。

          联合索引命中的本质(最左匹配的理解)

          定义

          当创建( col1,col2,col3 )联合索引时,相当于创建了( col )单列索引,( clo1,clo2 )联合索引以及( col1,col2,col3 )联合索引想要索引生效,只能使用 col1col1,col2col1,col2,col3 三种组合;

          当然,col1,col3 组合也可以,但实际上只用到了 col1 的索引,col3 并没有用到!

          图解

          在这里插入图片描述

          通俗理解

          联合索引相当于一个按照姓氏——名字的一个电话簿,只能先确定姓氏才可以命中索引,下列可以正确命中联合索引的语句( =IN 直接的字段都可以乱序,MySQL的查询优化器可以优化成索引识别的形式)

          -- 只命中 col1,col2
          SELECT * FROM `table_name` WHERE `col1`='XX';
          

          -- 命中col1,col2。col1,col2的顺序可以颠倒
          SELECT FROM table_name WHERE clo1='XX',clo2='XXX';
          SELECT
          FROM table_name WHERE clo2='XXX', clo1='XX';

          -- 命中col1,col2,col3,同理,三个列的顺可以颠倒
          SELECT FROM table_name WHERE col1='X',col2='XX',col3='XXX';
          SELECT
          FROM table_name WHERE col1='X',col3='XX',col2='XXX';
          SELECT * FROM table_name WHERE col2='X',col3='XX',col1='XXX';

            与[转帖]MySQL联合索引(复合索引)相似的内容:

            [转帖]MySQL联合索引(复合索引)

            Mysql联合唯一索引添加相同数据插入报错 联合索引在两个字段都存在唯一,将报错。 1.添加联合索引 alter table "表名" add unique index(`字段1`,`字段2`) 2.此时如果在插入相同的数据会报错,可以使用 no duplicate key update 解决相同数

            [转帖]MySQL创建联合索引报key长度超3072 bytes的[42000][1071]错误

            问题时这样的,我在建表时加了联合索引结果报key长度超过3072个字节了,如下图。 [42000][1071] Specified key was too long; max key length is 3072 bytes 先说解决方案:1.调整索引字段,包括修改字段长度、更换字段;2.使用前缀索

            [转帖]Mysql DBA运维命令大全

            Mysql DBA运维命令大全 https://www.modb.pro/db/97499 中国DBA联盟(ACDU)成员,目前从事DBA及程序编程(Web\java\Python)工作,主要服务于生产制造 现拥有 Oracle 11g OCP/OCM、Mysql、Oceanbase(OBCA)认证

            [转帖]一文带你了解mysql sql model的only_full_group_by模式

            https://zhuanlan.zhihu.com/p/368440685 Mysql only_full_group_by与Error 1055问题分析 1 声明 本文的数据来自网络,部分代码也有所参照,这里做了注释和延伸,旨在技术交流,如有冒犯之处请联系博主及时处理。 2 问题描述 ERROR

            [转帖]使用 SkyWalking 监控 MySQL(一)工具与方案

            https://my.oschina.net/GreatSQL/blog/5567471 * GreatSQL 社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。 注:本文适用于 SkyWalking v9.1.0。 SkyWalking 简介 SkyWalking 是一个分布式系统的应用

            [转帖]图文结合带你搞懂 MySQL 日志之 Slow Query Log(慢查询日志)

            https://my.oschina.net/GreatSQL/blog/5719211 GreatSQL 社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。 GreatSQL 是 MySQL 的国产分支版本,使用上与 MySQL 一致。 作者:KAiTO 文章来源:GreatSQL 社区

            [转帖]用sysbench进行数据库OLTP基准测试

            https://www.cnblogs.com/ariesblog/p/13847740.html 基于TPC-C的OLTP基准测试,对比Mysql和PostgreSQL的性能 一、什么是TPC-C和tpmC 1、TPC-C TPC-C是一种旨在衡量联机事务处理(OLTP)系统性能与可伸缩性的行业标

            [转帖]MySQL pid 和 socket 文件说明

            2021-10-13 11:595110转载MySQL 1 pid-file文件 MySQL 中的 pid 文件记录的是当前 mysqld 进程的 pid ,pid 亦即 Process ID 。可以通过 pid-file 参数来配置 pid 文件路径及文件名,如果未指定此变量,则 pid 文件默认

            [转帖]MySQL 慢查询日志深入理解

            https://www.jb51.net/article/210312.htm + 目录 什么是慢查询日志 MySQL的慢查询日志是 MySQL提供的一种日志记录,它用来记录在 MySQL 中响应时间超过阀值的语句,具体指运行时间超过long_query_time 值的 SQL,则会被记录到慢查询日

            [转帖]MySQL with Docker - Performance characteristics

            https://dev.mysql.com/blog-archive/mysql-with-docker-performance-characteristics/ Docker presents new levels of portability and ease of use when it co