精华内容
下载资源
问答
  • 唯一索引更新慢
    2020-12-01 18:11:30

    1.唯一索引在做更新操作的时候,首先要把数据页读入内存中,在数据页中判断有没有跟唯一索引相等的值,如果有就拒绝插入,反之插入成功。

    那么什么是数据页呢? InnoDB 在读取数据的时候是按照数据页去读取数据的,也就是当你要去查找一条id为1的数据的时候,并不是将这条记录从磁盘中读出来,而是以页为单位读入内存,每页大小默认为16KB。

     

    2.普通索引在进行数据更新的时候,并不需要进行重复判断,所以可以直接插入,当然普通索引的更新操作也不是直接对磁盘进行读写,而是去先把这些更新操作缓存到changebuffer中,以此结束更新。

    changebuffer 是支持持久化到磁盘中的。当系统访问这个数据页的时候,才会对changebuffer 的内容进行merge操作,也就是把更新操作更新到数据页中,达到数据一致性的效果,当然不仅仅访问数据页会进行merge操作,后台系统会定期对changebuffer 进行merge,当数据库正常关闭时(shut down)也会进行merge操作。

    综上所述,由于唯一索引在做更新操作时需要从硬盘中读取数据页,所以非常消耗io 更新时效率要低于普通索引。对于这两种索引的选择还是要在对应的业务场景中进行取舍。

     

    感谢大家能够看完描述的问题,说的不对的地方欢迎大家在评论区指正。

    更多相关内容
  • 以前使用SQL Server进行表分区的时候就碰到很多关于唯一索引的问题:Step8:SQL Server 当表分区遇上唯一约束,没想到在MySQL的分区中一样会遇到这样的问题:MySQL表分区实战。 今天我们来了解MySQL唯一索引的一些...
  • mysql索引(七)唯一索引

    万次阅读 2021-07-19 11:17:54
    唯一索引(UNIQUE):与"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。 主键索引(PRIMARY):它 是一种特殊的唯一索引,不允许有空值。 全文索引(FULLTEXT ):可用于 MyISAM 表,mysql5.6之后也可...

    Mysql索引大概有五种类型:

    普通索引(INDEX):最基本的索引,没有任何限制
    唯一索引(UNIQUE):与"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。
    主键索引(PRIMARY):它 是一种特殊的唯一索引,不允许有空值。
    全文索引(FULLTEXT ):可用于 MyISAM 表,mysql5.6之后也可用于innodb表, 用于在一篇文章中,检索文本信息的, 针对较大的数据,生成全文索引很耗时和空间。
    联合(组合)索引:为了更多的提高mysql效率可建立组合索引,遵循”最左前缀“原则。

    这里我们来看下唯一索引。

    之前我们看了主键索引,他是一种特殊的唯一索引,二者的区别是,主键索引不能有空值,但是唯一索引可以有空值。

    一:基本使用

    1:唯一索引可以是单列,也可以是多列,下面我们来看下创建语句:

    # 创建单列唯一索引
    
    alter table sc add unique (name);
    # 创建多列唯一索引
    
    alter table sc add unique key `name_score` (`name`,`score`);
    

    2:删除唯一索引语句:

    alter table sc drop index name;

    在这里插入代码片
    

    二:唯一索引作用

    1:最大的所用就是确保写入数据库的数据是唯一值。

    单列唯一值基本上就是主键。

    常用的一般都是多列的唯一索引,比如:当前商品,一个用户只能购买一件。我们将用户id及商品id列设置成唯一索引。那么就可以避免一个用户出现重复购买的情况。

    示例:

    创建数据表:

    MariaDB [test]> CREATE TABLE t(
        -> c1 CHAR(1) not null,
        -> c2 CHAR(1) not null,
        -> c3 CHAR(1) not null,
        -> c4 CHAR(1) not null,
        -> c5 CHAR(1) not null
        -> )ENGINE myisam CHARSET UTF8;
    Query OK, 0 rows affected (0.09 sec)
    

    添加几条数据:

    MariaDB [test]> insert into t VALUES('1','1','1','1','1'),('2','2','2','2','2'),('3','3','3','3','3'),('4','4','4','4','4'),('5','5','5','5','5');
    Query OK, 5 rows affected (0.00 sec)
    Records: 5  Duplicates: 0  Warnings: 0
    

    创建唯一索引:

    MariaDB [test]> alter table t add unique key `name_score` (`c2`,`c3`);
    Query OK, 5 rows affected (0.01 sec)              
    Records: 5  Duplicates: 0  Warnings: 0
    

    写入重复数据失败:

    MariaDB [test]> insert into t (c1,c2,c3,c4,c5) values ('1','1','1','1','1');
    ERROR 1062 (23000): Duplicate entry '1-1' for key 'name_score'
    

    2:提高查询速度

    使用index索引时,经常导致慢查询,耗时2秒左右,遇忙时更有达到5秒的

    改用unique之后,查询耗时在0.0003秒 基本可以忽略不计

    三:唯一索引和主键索引的具体区别

    1:唯一性约束所在的列允许空值,但是主键约束所在的列不允许空值。
    2:可以把唯一性约束放在一个或者多个列上,这些列或列的组合必须有唯一的。但是,唯一性约束所在的列并不是表的主键列。
    3:唯一性约束强制在指定的列上创建一个唯一性索引。在默认情况下,创建唯一性的非聚簇索引,但是,也可以指定所创建的索引是聚簇索引。
    4:建立主键的目的是让外键来引用.
    5: 一个表最多只有一个主键,但可以有很多唯一键

    四:存在唯一键冲突时,避免策略

    1:使用insert ignore语句

    insert ignore会忽略数据库中已经存在的数据(根据主键或者唯一索引判断),如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据.

    MariaDB [test]> insert ignore into t (c1,c2,c3,c4,c5) values ('1','1','1','1','2');
    Query OK, 0 rows affected, 1 warning (0.00 sec)
     
    MariaDB [test]> select * from t;
    +----+----+----+----+----+
    | c1 | c2 | c3 | c4 | c5 |
    +----+----+----+----+----+
    | 1  | 1  | 1  | 1  | 1  |
    | 2  | 2  | 2  | 2  | 2  |
    | 3  | 3  | 3  | 3  | 3  |
    | 4  | 4  | 4  | 4  | 4  |
    | 5  | 5  | 5  | 5  | 5  |
    +----+----+----+----+----+
    5 rows in set (0.00 sec)
    

    Sql执行成功,但是我们查询表的数据,发现并没有写入成功。是因为唯一索引已经存在。跳过了这条写入的命令。

    2:使用replace into语句

    replace into 首先尝试插入数据到表中。 如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据,否则,直接插入新数据。

    使用replace into,你必须具有delete和insert权限

    示例:

    MariaDB [test]> replace into t (c1,c2,c3,c4,c5) values ('1','1','1','1','2');
    Query OK, 2 rows affected (0.00 sec)
    
    # 先执行删除,再执行写入
     
    MariaDB [test]> select * from t;
    +----+----+----+----+----+
    | c1 | c2 | c3 | c4 | c5 |
    +----+----+----+----+----+
    | 1  | 1  | 1  | 1  | 2  |
    | 2  | 2  | 2  | 2  | 2  |
    | 3  | 3  | 3  | 3  | 3  |
    | 4  | 4  | 4  | 4  | 4  |
    | 5  | 5  | 5  | 5  | 5  |
    +----+----+----+----+----+
    5 rows in set (0.00 sec)
    

    3:使用insert on duplicate key update语句

    如果在insert into 语句末尾指定了on duplicate key update,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则在出现重复值的行执行UPDATE;如果不会导致重复的问题,则插入新行,跟普通的insert into一样。

    使用insert into,你必须具有insert和update权限

    如果有新记录被插入,则受影响行的值显示1;如果原有的记录被更新,则受影响行的值显示2;如果记录被更新前后值是一样的,则受影响行数的值显示0

    示例:

    MariaDB [test]> insert into t (c1,c2,c3,c4,c5) values ('1','1','1','1','2') on duplicate key update c2 = 5;
    Query OK, 2 rows affected (0.00 sec)
     
    MariaDB [test]> select * from t;
    +----+----+----+----+----+
    | c1 | c2 | c3 | c4 | c5 |
    +----+----+----+----+----+
    | 1  | 5  | 1  | 1  | 2  |
    | 2  | 2  | 2  | 2  | 2  |
    | 3  | 3  | 3  | 3  | 3  |
    | 4  | 4  | 4  | 4  | 4  |
    | 5  | 5  | 5  | 5  | 5  |
    +----+----+----+----+----+
    5 rows in set (0.00 sec)
    

    这里需要注意一下:

    insert … on duplicate key 在执行时,innodb引擎会先判断插入的行是否产生重复key错误,
    如果存在,在对该现有的行加上S(共享锁)锁,如果返回该行数据给mysql,然后mysql执行完duplicate后的update操作,
    然后对该记录加上X(排他锁),最后进行update写入。

    如果有两个事务并发的执行同样的语句,
    那么就会产生death lock(死锁)

    因此在使用的时候尽量避免:

    尽量对存在多个唯一键的table使用该语句

    在有可能有并发事务执行的insert 的内容一样情况下不使用该语句

    4:总结

    这三种方法都能避免主键或者唯一索引重复导致的插入失败问题。

    insert ignore能忽略重复数据,只插入不重复的数据。

    replace into和insert … on duplicate key update,都是替换原有的重复数据,区别在于replace into是删除原有的行后,在插入新行,如有自增id,这个会造成自增id的改变;insert … on duplicate key update在遇到重复行时,会直接更新原有的行,具体更新哪些字段怎么更新,取决于update后的语句。

    有好的建议,请在下方输入你的评论。

    欢迎访问个人博客
    https://guanchao.site

    欢迎访问小程序:

    在这里插入图片描述

    展开全文
  • 唯一索引可作为数据的一个合法验证手段,例如学生表的身份证号码字段,我们人为规定该字段不得重复,那么就使用唯一索引。(一般设置学号字段为主键) 主键和唯一索引 主键保证数据库里面的每一行都是唯一的,比如...

    1 概念区分

    普通索引和唯一索引

    普通索引可重复,唯一索引和主键一样不能重复。 唯一索引可作为数据的一个合法验证手段,例如学生表的身份证号码字段,我们人为规定该字段不得重复,那么就使用唯一索引。(一般设置学号字段为主键)

    主键和唯一索引

    主键保证数据库里面的每一行都是唯一的,比如身份证,学号等,在表中要求唯一,不重复。唯一索引的作用跟主键的作用一样。 不同的是,在一张表里面只能有一个主键,主键不能为空,唯一索引可以有多个,唯一索引可以有一条记录为空,即保证跟别人不一样就行。 比如学生表,在学校里面一般用学号做主键,身份证则弄成唯一索引;而到了教育局,他们就把身份证号弄成主键,学号换成了唯一索引。 选谁做表的主键,要看实际应用,主键不能为空。

    2 案例引入

    某居民系统,每人有唯一身份证号。如果系统需要按身份证号查姓名,就会执行类似如下SQL:

    select name from CUser where id_card = 'ooxx';
    

    然后你肯定会在id_card字段建索引。但id_card字段较大,不推荐将其做主键。于是现有俩选择:

    • 给id_card字段创建唯一索引
    • 创建一个普通索引

    假定业务代码已保证不会写入重复的身份证号,这两个选择逻辑上都正确。但从性能角度考虑,唯一索引还是普通索引呢?

    再看如下案例:假设字段 k 上的值都不重复。

    InnoDB的索引组织结构:
    在这里插入图片描述
    接下来分析性能。

    3 查询性能

    select id from T where k=4
    

    通过B+树从树根开始层序遍历到叶节点,可认为数据页内部是通过二分法搜索。

    • 普通索引,查找到满足条件的第一个记录(4,400)后,需查找下个记录,直到碰到第一个不满足k=4的记录
    • 唯一索引,由于索引具备唯一性,查找到第一个满足条件的记录后,就会停止检索
      看起来性能差距很微小。

    InnoDB数据按数据页单位读写。即读一条记录时,并非将该一个记录从磁盘读出,而以页为单位,将其整体读入内存。

    因此普通索引,要多做一次“查找和判断下一条记录”的操作,也就一次指针寻找和一次计算。 如果k=4记录恰为该数据页最后一个记录,那么要取下个记录,还得读取下个数据页,操作稍微复杂。 对整型字段,一个数据页可存近千key,因此这种情况概率其实也很低。因此计算平均性能差异时,可认为该操作成本对现在CPU开销忽略不计。

    我们知道 MySQL 有 change buffer。

    4 更新性能

    现在来看往表中插入一个新记录(4,400),InnoDB会做什么?

    需要区分该记录要更新的目标页是否在内存:

    4.1 在内存

    • 唯一索引
      找到3和5之间位置,判断到没有冲突,插入值,语句执行结束。

    • 普通索引
      找到3和5之间位置,插入值,语句执行结束。

    普通索引和唯一索引对更新语句性能影响的差别,只是一个判断,耗费微小CPU时间。

    4.2 不在内存

    • 唯一索引
      需将数据页读入内存,判断到没有冲突,插入值,语句执行结束。

    • 普通索引
      将更新记录在change buffer,语句执行结束。

    将数据从磁盘读入内存涉及随机IO访问,是数据库里面成本最高操作之一。而change buffer减少随机磁盘访问,所以更新性能提升明显。

    5 实践中的索引选择

    普通索引和唯一索引究竟如何抉择?这两类索引在查询性能上没差别,主要考虑对更新性能影响。所以,推荐尽量选择普通索引。

    如果所有更新后面,都紧跟对该记录的查询,那么该关闭change buffer。 而在其他情况下,change buffer都能提升更新性能。 普通索引和change buffer的配合使用,对于数据量大的表的更新优化还是很明显的。

    在使用机械硬盘时,change buffer机制的收效非常显著。 所以,当你有一个类似“历史数据”的库,并且出于成本考虑用机械硬盘时,应该关注这些表里的索引,尽量使用普通索引,把change buffer 开大,确保“历史数据”表的数据写速度。

    6 change buffer 和 redo log

    WAL 提升性能的核心机制,也是尽量减少随机读写,这两个概念易混淆。 所以,这里我把它们放到了同一个流程里来说明区分。

    6.1 插入流程

    insert into t(id,k) values(id1,k1),(id2,k2);
    

    假设当前k索引树的状态,查找到位置后,k1所在数据页在内存(InnoDB buffer pool),k2数据页不在内存。

    带change buffer的更新流程图,图中两个箭头都是后台操作,不影响更新响应。

    在这里插入图片描述

    该更新做了如下操作:

    • Page1在内存,直接更新内存
    • Page2不在内存,就在change buffer区,缓存下“往Page2插一行记录”的信息
    • 将前两个动作记入redo log

    之后事务完成。执行该更新语句成本很低,只写两处内存,然后写一处磁盘(前两次操作合在一起写了一次磁盘),还是顺序写。

    6.2 怎么处理之后的读请求?

    select * from t where k in (k1, k2);
    

    读语句紧随更新语句,内存中的数据都还在,此时这俩读操作就与系统表空间和 redo log 无关。所以在图中就没画这俩。

    带change buffer的读过程
    在这里插入图片描述
    读Page1时,直接从内存返回。 WAL之后如果读数据,是不是一定要读盘,是不是一定要从redo log里面把数据更新以后才可以返回?其实不用。 看上图状态,虽然磁盘上还是之前数据,但这里直接从内存返回结果,结果正确。

    要读Page2时,需把Page2从磁盘读入内存,然后应用change buffer里面的操作日志,生成一个正确版本并返回结果。 可见直到需读Page2时,该数据页才被读入内存。

    所以,要简单对比这俩机制对更新性能影响

    • redo log 主要节省随机写磁盘的IO消耗(转成顺序写)
    • change buffer主要节省随机读磁盘的IO消耗

    7 总结

    由于唯一索引用不了change buffer的优化机制,因此如果业务可以接受,从性能角度,推荐优先考虑非唯一索引。

    7.1 关于到底是否使用唯一索引

    主要纠结在“业务可能无法确保”。本文前提是“业务代码已经保证不会写入重复数据”下,讨论性能问题。

    如果业务不能保证,或者业务就是要求数据库来做约束,那么没得选,必须创建唯一索引。这种情况下,本文意义在于,如果碰上大量插入数据慢、内存命中率低时,多提供一个排查思路。
    然后,在一些“归档库”的场景,可考虑使用唯一索引的。比如,线上数据只需保留半年,然后历史数据保存在归档库。此时,归档数据已是确保没有唯一键冲突。要提高归档效率,可考虑把表的唯一索引改普通索引。

    7.2 如果某次写入使用change buffer,之后主机异常重启,是否会丢失change buffer的数据?

    不会丢失。 虽然是只更新内存,但在事务提交时,我们把change buffer的操作也记录到redo log,所以崩溃恢复时,change buffer也能找回。

    7.3 merge的过程是否会把数据直接写回磁盘?

    merge执行流程

    • 从磁盘读入数据页到内存(老版本数据页)
    • 从change buffer找出该数据页的change buffer 记录(可能有多个),依次应用,得到新版数据页
    • 写redo log

    该redo log包含数据的变更和change buffer的变更

    至此merge过程结束。 这时,数据页和内存中change buffer对应磁盘位置都尚未修改,是脏页,之后各自刷回自己物理数据,就是另外一过程。

    问题思考

    在构造第一个例子的过程,通过session A的配合,让session B删除数据后又重新插入一遍数据,然后就发现explain结果中,rows字段从10001变成37000多。 而如果没有session A的配合,只是单独执行delete from t 、call idata()、explain这三句话,会看到rows字段其实还是10000左右。这是什么原因呢?

    如果没有复现,检查

    • 隔离级别是不是RR(Repeatable Read,可重复读)
    • 创建的表t是不是InnoDB引擎

    为什么经过这个操作序列,explain的结果就不对了? delete 语句删掉了所有的数据,然后再通过call idata()插入了10万行数据,看上去是覆盖了原来10万行。 但是,session A开启了事务并没有提交,所以之前插入的10万行数据是不能删除的。这样,之前的数据每行数据都有两个版本,旧版本是delete之前数据,新版本是标记deleted的数据。 这样,索引a上的数据其实有两份。

    然后你会说,不对啊,主键上的数据也不能删,那没有使用force index的语句,使用explain命令看到的扫描行数为什么还是100000左右?(潜台词,如果这个也翻倍,也许优化器还会认为选字段a作为索引更合适) 是的,不过这个是主键,主键是直接按照表的行数来估计的。而表的行数,优化器直接用的是show table status的值。 大家的机器如果IO能力比较差的话,做这个验证的时候,可以把innodb_flush_log_at_trx_commit 和 sync_binlog 都设置成0。

    展开全文
  • # (四):MySQL建立索引,唯一索引和组合索引先大致介绍下项目的数据库信息。数据库A:主要存放的通用的表,如User、Project、Report等。数据库B、C、D:一个项目对应一个数据库,而且这几个项目的表是完全一样的。**...

    # (四):MySQL建立索引,唯一索引和组合索引

    先大致介绍下项目的数据库信息。

    数据库A:主要存放的通用的表,如User、Project、Report等。

    数据库B、C、D:一个项目对应一个数据库,而且这几个项目的表是完全一样的。

    **数据库表的特点**

    A中的表:数据量几乎都比较小,比如User表中用户数,顶多也就几百上千。

    B中的表:X/Y/Z 3张表几乎是确定的,Data表 中的数据量比较大,几千万到上亿。

    周期性的会加入一大批数据,比如,每月末增加几百万条数据。

    即一般情况下,B中的表只有查询操作,而且特别是Data查询频繁且数据量很大。

    **建立索引**

    1.为所有的表建立了唯一索引,索引字段是主键id。

    2.考虑到数据库A中表的数据量很小,暂时没有建立组合索引。

    如有可能,对频繁查询的表和字段,后期尝试加入组合索引。

    3.对Data表建立组合索引。

    频繁查询的一条SQL语句

    select  from Data where projectId=? and (inputVersion in (201)) and (sideId in (10001)) and (breakId in (?)) and (periodId in (?))  order by id desc;

    建立组合索引的语句

    **ALTER TABLE Data ADD INDEX data_query_index (projectId,inputVersion,sideId,breakId,periodId);**

    **建立索引之前,需要花费2.796秒。**

    **建立索引之后,只需要0.136秒。**

    可以说是,大幅度提升了查询效率。

    **索引的弊端**

    随之而来的问题:如果已经建立了索引,那么批量增加数据的时候,会特别慢。

    一种较快的方法是:批量插入数据之前,先删除索引,提高批量插入数据的效率。

    然后,再重新建立索引,提高查询效率。

    1000万条记录,重建5个字段的组合索引需要2到3秒。

    重建索引的问题是,这个过程中,查询会比较慢。

    应对之策:导入数据,重建索引 应该选择 晚上/凌晨等用户较少使用系统的时间段。

    **一个建议**

    用 explain sql;

    可以分析sql语句的执行情况,进而对sql语句进行优化。

    **天下武功,唯勤不破**

    性能优化,以前只是看过一些书,没啥实践经验。

    最近项目需要由我来进行优化,只好硬着头皮一点点去实践。

    网上搜资料、请教同事、请教大牛。

    周末再多看看书,认真复习和学习Linux、MySQL、Tomcat、Redis等一大堆,先侧重系统优化。

    展开全文
  • myisam通过key_buffer把索引先缓存到内存中,当需要访问数据时(通过索引访问数据),在内存中直接搜索索引,然后通过索引找到磁盘相应数据,这也就是为什么索引不在key buffer命中时,速度的原因 澄清一个概念:...
  • 普通索引与唯一索引

    万次阅读 多人点赞 2019-04-08 20:20:06
    所谓唯一索引,就是在创建索引时,限制索引的值必须是唯一的。通过该类型的索引可以更快速地查询某条记录。 普通索引还是唯一索引? 假设你在维护一个市民系统,每个人都有一个唯一的身份证号,而且业务代码已经...
  • 普通索引 这是最基本的索引类型,而且它没有唯一性之类的限制。 唯一性索引 这种索引和前面的“普通索引”基本相同,...对于唯一索引来说,由于索引定义了唯一性,查找到第一个满足条件的记录后,就会停止继续检索...
  • 问题:大量插入数据,内存命中率低,考虑是不是唯一索引的问题? 问题:为什么不建议字段长的做主键(比如身份证)? 在主键索引上,叶子节点存储主键值,叶子节点占用空间越多,那么整个树的高度变大,从而导致...
  • B树与红黑树最广泛的应用就是数据库索引,熟练使用索引是程序员最重要的基本功之一。索引的数据结构可以是树,也可以是哈希表。常用的数据库都是树结构的索引,本篇的背景也全部以树结构的索引为前提。本文旨在梳理...
  • --创建唯一索引 create unique index 索引名 on 表名(列名); --创建普通索引 create index 索引名 on 表名(列名); 实际区别: -唯一索引:当前索引列不会有重复的值 -普通索引:当前索引列可能有重复的值 使用...
  • 我秃了!唯一索引、普通索引我该选谁?

    千次阅读 多人点赞 2021-09-06 00:35:26
    你遇到过不知道如何选择唯一索引和普通索引的场景么?你知道他俩的原理和区别么?来不及了,快上车!!
  • 主键索引: 主键索引不可以为空 主键索引可以做外键 一张表中只能有一个主键索引 ...唯一索引: 被索引的数据列不允许包含重复的值 以下内容转载自:https://blog.csdn.net/qq_41618510/article/details/...
  • 索引是什么? 索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。 索引的作用相当于图书的...
  • ** 因为本人之前一直写的是电子笔记,对自己学会的东西作一个总结,所以基本都是文字,本来想全发成博客的形式,发现全发成博客比较花费时间,而且一直发博客质量不是...索引就是用来提高数据库性能的东西,不用加内...
  • 天天搞数据,聚集索引非聚集索引,唯一索引,非唯一索引,天天见但不理解,网上也找不到几个能说囫囵的。今天处理数据库问题时被老大教育一番,然后给我普及了一数据库索引的知识。 聚集索引 聚集索引的作用对象是...
  • 唯一索引/非唯一索引主键索引(主索引)聚集索引/非聚集索引组合索引唯一索引/非唯一索引唯一索引1.唯一索引是在表上一个或者多个字段组合建立的索引,这个或者这些字段的值组合起来在表中不可以重复。非唯一索引2....
  • mysql添加索引,查询反而变

    千次阅读 2021-03-03 21:35:20
    1.表结构,time1添加普通索引:CREATE TABLE `time_table` (`time1` INT(11) NULL DEFAULT NULL,`time2` INT(11) NULL DEFAULT NULL,INDEX `time1` (`time1`))ENGINE=MyISAM;2.蠕虫复制创建200万条数据insert into ...
  • MySQL的btree索引和hash索引的区别 Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像BTree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率...
  • 回答是,如果没有主键,则按照下列规则来建聚簇索引没有主键时,会用一个唯一且不为空的索引列做为主键,成为此表的聚簇索引如果没有这样的索引,InnoDB会隐式定义一
  • MySQL索引结构原理分析

    千次阅读 2021-02-02 06:52:16
    我们在学习MySQL的时候经常会听到索引这个词,大概也知道这是什么,但是深究下去又说不出什么道道来。下面将会比较全面的介绍一下关于索引索引是什么?这里用百度百科的一句话来说,在关系数据库中,索引是一种...
  • 如题,两张表,关联查询的字段都用设置了唯一索引,因为关联查询时LEFT JION,所以左连接的唯一索引不生效我能理解,但为什么右连接的表的唯一索引也没生效呢,以下附上执行计划截图 结帖:两表排序规则不一致,...
  • MongoDB索引说明及查询优化

    千次阅读 2019-05-01 20:42:50
    文章目录索引种类索引语法查询优化第一步:找出查询语句第二步:分析查询第三步:分析explain结果索引优化实战索引建议 索引种类 索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描...
  • 索引对数据库性能的影响? 本质:缩小查询范围。大大减少需要扫描的数据量。...主键索引是唯一索引,但唯一索引不是主键索引, 主键可以和外键构成参照完整性约束,防止数据不一致。 mysql索引的创建原则? ...
  • 需求 在前端表格处需要显示一些附加信息。便要额外连接两张表。...到前端一刷新,好(实际上,这中间隔了大概一周时间,又新增了几十万数据,普遍反应太!),大约需要20+s; 然后,从前端到后...
  • Oracle 建立索引及SQL优化

    千次阅读 2021-05-01 10:14:40
    如何某表的某个字段有主键约束和唯一性约束,则Oracle 则会自动在相应的约束列上建议唯一索引。数据库索引主要进行提高访问速度。建议原则:1、索引应该经常建在Where 子句经常用到的列上。如果某个大表经常使用某个...
  • 和开发讨论之后加唯一索引,加的时候发现有重复数据,然后用聚合命令统计了一下24w的数据有10w+的重复数据, 开发说update操作的时候加了{upsert:true},应该是查询不到新增一条,不会有重复数据, 然后查看...
  • 文章目录一、考点1、MySQL索引的基础和类型1)索引的基础2)索引对性能的影响3)索引的使用场景4)索引的类型常考题:唯一索引 与主键索引 当前区别是什么?2、延伸1)MySQL索引的创建原则① 最适合索引的列是出现在...
  • 这一次,我们主要来聊聊,MySQL中的索引。 MySQL是目前绝大多数互联网公司使用的关系型数据库,它性能出色、资源丰富、成本低廉,是快速搭建互联网应用的首选关系型数据库。但是,俗话说,“好马配好鞍”,仅仅会...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 145,188
精华内容 58,075
热门标签
关键字:

唯一索引更新慢