普通索引和唯一索引 基本概述 MySQL中可以创建普通索引与唯一索引,这两种索引的区别是: 普通索引(Non-Unique Index),也称为非唯一索引,它允许索引中的条目具有重复的键值。...普通索引的主要目的是加快查询速度,它并不关心数据的唯一性。 普通索引的特点: 可以包含重复的索引键值。 适用于快速查找具有相同索引值的多个记录的场景。 不保证数据的唯一性。...普通索引创建方法: CREATE INDEX idx_email ON customers(email); 唯一索引(Unique Index)是一种数据库索引,它要求索引中的所有键值都是唯一的。...如果尝试插入或更新记录以产生重复的索引键值,数据库将拒绝这种操作。 唯一索引的特点: 保证索引中的键值是唯一的。 适用于确保数据表中某一列或列组合的唯一性,例如身份证号、用户名等。...唯一索引创建方法: CREATE UNIQUE INDEX uidx_email ON customers(email); 使用场景 因为InnoDB引擎是按数据页为单位进行读写操作的,当需要读一条记录的时候
,现在需要考虑在车辆表车牌号字段增加索引,现有两种索引可供选择:唯一索引、普通索引。...当需要读一条记录的时候,并不是将这个记录本身从磁盘读出来,而是以页为单位,将其整体读入内存。在InnoDB中,每个数据页的大小默认是16KB....当目标数据页不在内存中时,唯一索引需要将数据从磁盘读入到内存,涉及到IO随机访问,是数据库成本最高的操作之一,普通索引只是需要将数据记录在change buffer,change buffer减少了磁盘随机访问...change buffer的使用场景 change buffer将变更记录缓存后,只有触发merge时才会真正更新落库,所以在change buffer在落库前,change buffer记录变更越多,...引用自极客时间《MySQL实战45讲》
对于普通索引,查询到满足的而第一个记录后,需要向后继续寻找,直到不满足条件 对于唯一索引,由于索引的唯一性,查询到数据后,直接停止查询 上面的不同索引带来的性能差异是微乎其微的 一般InnoDB的数据是按数据页为单位来读写的...那么什么时候可以使用change buffer呢 对于唯一索引,所有的更新操作都要判断这个操作是否违反唯一性约束,比如要插入(4,400)记录,就要判断表中是否已经存在k=4的记录,而这将必须把数据也读取到内存中...以上就是change buffer基本原理,现在我们看看更新操作,插入(4,400)记录,分为两种情况 第一种是更新的记录在内存中 对于唯一索引找到3和5之间的位置,判断没有冲突就插入这个值,语句结束...对于普通索引找到3和5之间的位置,插入这个值,语句结束 这种情况差距就是判断冲突的操作,影响差别不大 第二种更新记录不在内存中 对于唯一索引,需要将数据页读入内存中,判断有没有冲突,插入这个值,语句结束...索引的选择和实践 普通索引和唯一索引选择,其实,这类索引在查询能力上是没有差别,主要考虑的是对更新性能的影响,所以建议选择普通索引。
MySQL 普通索引和唯一索引该如何选择? 普通索引和唯一索引在查询能力上没啥差别,主要考虑对更新性能的影响,要尽量选择普通索引。接下来分析两种索引在查询语句和更新语句对性能的影响。...image 对应普通索引来说,查找到满足条件的第一个记录 (5,500) 之后,需要查找下一个记录,直到找到第一个不满足 k =5 的记录终止检索。...对于唯一索引来说,定义了唯一性,找到了第一个满足条件的记录后,停止检索。...如果每一次更新操作都需要写进磁盘,然后磁盘要找到那条记录,然后再更新,整个过程 IO 成本很高,查找成本很高。MySQL 采用了什么方式提高更新效率呢?...MySQL 采用 WAL 技术,Write Ahead Loging,关键点是先写日志再写磁盘,具体执行如下:当有一条记录需要更新的时候,InnoDB 引擎会先把记录写到 redo log里,并更新内存
MySQL 中随机选择10条记录 SELECT id FROM user ORDER BY RAND() LIMIT 10; 数据量小于1000行的时候,上面的 sql 执行的快。...具体解释参考:sql语句嵌套查询性能低 要找一种方法,保证random-id只生成一次: SELECT name FROM user JOIN (SELECT CEIL(RAND()...非连续数据 删除一些行,构造ID非连续的记录。...平等分配 当我们的ID分布不再相等时,我们选择的行也不是真正随机的。...参考 MySQL select 10 random rows from 600K rows fast ORDER BY RAND()
版权声明:本文为博主原创文章,未经博主允许不得转载。 表结构 CREATE TABLE `t3` ( `id` int(11) NOT NUL...
1.前言在之前的文章中,我们讲解了索引的基本概念,相信你已经了解了唯一索引和普通索引的区别。今天我们就来讨论一下,在不同的业务场景下,应该选择普通索引,还是唯一索引?...如果业务代码已经保证了不会写入重复的身份证号,那么这两个选择逻辑上都是正确的。现在我要问你的是,从性能的角度考虑,你选择唯一索引还是普通索引呢?选择的依据是什么呢?...对于普通索引来说,查找到满足条件的第一个记录(5,500)后,需要查找下一个记录,知道碰到第一个不满足k=5条件的记录。对于唯一索引来说,由于索引的唯一性,查找到第一个满足条件的记录后,就会停止检索。...5.索引选择和实践回到我们文章开头的问题,普通索引和唯一索引应该怎么选择,其实,这两类索引在查询能力上没有差别,主要考虑的是对更新性能的影响,所以,我建议你尽量使用普通索引。...7.小结今天,我们从普通素银和唯一索引的选择开始,分析了数据的查询和更新过程,然后说明了change buffer的机制以及应用场景,最后讲到了索引选择的实践。
Mysql索引大概有五种类型: 普通索引(INDEX):最基本的索引,没有任何限制 唯一索引(UNIQUE):与”普通索引”类似,不同的就是:索引列的值必须唯一,但允许有空值。...联合(组合)索引:为了更多的提高mysql效率可建立组合索引,遵循”最左前缀“原则。 这里我们来看下唯一索引。...使用insert into,你必须具有insert和update权限 如果有新记录被插入,则受影响行的值显示1;如果原有的记录被更新,则受影响行的值显示2;如果记录被更新前后值是一样的,则受影响行数的值显示...,然后mysql执行完duplicate后的update操作, 然后对该记录加上X(排他锁),最后进行update写入。...4:总结 这三种方法都能避免主键或者唯一索引重复导致的插入失败问题。
我现在有一个应用 几乎就是按照这种顺序来查找记录的 所以,我就建立了联合索引 —————————————————- 建立联合索引之后,也不影响你再在这个字段上面创建普通索引。
在前面的基础篇文章中,我给你介绍过索引的基本概念,相信你已经了解了唯一索引和普通索引的区别。今天我们就继续来谈谈,在不同的业务场景下,应该选择普通索引,还是唯一索引?...由于身份证号字段比较大,我不建议你把身份证号当做主键,那么现在你有两个选择,要么给 id_card 字段创建唯一索引,要么创建一个普通索引。...如果业务代码已经保证了不会写入重复的身份证号,那么这两个选择逻辑上都是正确的。 现在我要问你的是,从性能的角度考虑,你选择唯一索引还是普通索引呢?选择的依据是什么呢?...索引选择和实践 回到我们文章开头的问题,普通索引和唯一索引应该怎么选择。其实,这两类索引在查询能力上是没差别的,主要考虑的是对更新性能的影响。所以,我建议你尽量选择普通索引。...小结 今天,我从普通索引和唯一索引的选择开始,和你分享了数据的查询和更新过程,然后说明了 change buffer 的机制以及应用场景,最后讲到了索引选择的实践。
mysql在存在主键冲突或者唯一键冲突的情况下,根据插入策略不同,一般有以下三种避免方法。...如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据,否则,直接插入新数据。...,新增了一条id=4,c1=3的记录. replace into语句执行完会返回一个数,来指示受影响的行的数目。...使用insert into,你必须具有insert和update权限 如果有新记录被插入,则受影响行的值显示1;如果原有的记录被更新,则受影响行的值显示2;如果记录被更新前后值是一样的,则受影响行数的值显示...结论: 这三种方法都能避免主键或者唯一索引重复导致的插入失败问题。 insert ignore能忽略重复数据,只插入不重复的数据。
" "order_no" "max(amt)" "1" "111" "102" "2" "222" "202" "3" "333" "302" **/ ##DEMO2:根据每个订单号找出ID最大的一行记录...期望结果: "id" "order_no" "amt" "5" "111" "102" "7" "222" "202" "9" "333" "302" **/ ##ID最小的这一行,不符合要求,以下5个方法...SELECT * FROM `test_user` GROUP BY order_no ##简单方法:倒序然后再分组,可以查询出来。....* FROM ( SELECT * FROM `test_user` ORDER BY id DESC ) t GROUP BY order_no ##找出最大的这一条记录数 ##方法1 根据ID来关联...`id`); ##方法4 根据LEFT JOIN的订单号和max ID来关联 (方法2的另外一种表现形式) SELECT t.* FROM `test_user` t INNER JOIN (SELECT
Docker并不是唯一的容器化工具,可能还有更好的选择…… ? 在容器的早期时代(其实更像是4年前),Docker是容器游戏中唯一的玩家。...但现在情况已经不一样了,Docker不再是唯一的一个,而只是其中一个容器引擎而已。...构建镜像 对于容器引擎来说,一般都只选择Docker。但是,当涉及到构建镜像时,选择的余地还是比较多的。 首先,介绍一下Buildah。...唯一的例外是(在我看来)与Docker的区别是,由Buildah构建的镜像是基于用户的,因此用户可以只列出自己构建的镜像。...这里唯一要提到的可以完成这些任务的工具是Skopeo。它由红帽公司开发,是Buildah,Podman和CRI-O的配套工具。
乱花渐欲迷人眼,Overlay技术的选择多种多样。目前最流行的Overlay技术方案应该就是VXLAN协议,这很大程度上与思科、Arista、博通、VMware这些网络巨头在背后的支持有关。...如果现网设备支持VXLAN并且具备VXLAN隧道终端节点(VTEP)的功能,那么VXLAN是实现Overlay方案的不错选择。...在这种情况下使用Labeled BGP(带有标签分发能力的BGPV4)而不是VxLAN也是个很好的选择。...这个RFC规定了BGP路由器在BGP更新消息中携带路由条目对应标签信息的方法,以便进行标签分发。当BGP被用于发布指定路由时,同样可以用于携带MPLS标签和路由的映射。...每个vxlan网络由唯一的VNI 标识,不同的 vxlan 可以不相互影响。
// MySQL数据备份方法的选择和思考 // 从事DBA的行业也有两年多了,在数据备份上无论是理论和实践上,都积累了一些经验,恰逢这两天又出现一些数据备份方面的问题,这里,我将之前遇到过的数据备份方法简单做个整理...我自己总结了以下方法: 1、rsync、cp拷贝文件 这种方法比较暴力,就是直接停止MySQL数据库,然后通过cp、rsync这种Linux物理文件复制命令,来实现数据的备份。...这种备份方法适合单个表的某一部分数据变更前的备份。 3、延时从库 在MySQL中,这种备份方案相对比较少,在MongoDB中,延时从库非常常见。...4、逻辑备份mysqldump 这可能是最常见的一种MySQL备份方式了,mysqldump这个官方提供的备份工具,可以提供给你某个时间点的一致性快照,可以很清楚的知道当前的时间点,MySQL数据库执行到了那个...我们可以在一个从库上线停掉复制关系,然后flush log新生成一个binlog,记录为binlog0,然后将这个从库完整的备份拷贝一份,之后保存binlog0往后的所有binlog,这样就能利用从库的完整备份
index 索引名称(数据库字段名称) PRIMARY KEY(主键索引) ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) UNIQUE(唯一索引...) ALTER TABLE `table_name` ADD UNIQUE (`column`) INDEX(普通索引) mysql>ALTER TABLE `table_name` ADD INDEX...tableColumns(length)) (3)创建表的时候直接指定:CREATE TABLE tableName ( […], INDEX [indexName] (tableColumns(length)) ; 2.唯一索引...它与前面的”普通索引”类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。
选择普通索引还是唯一索引?...对于查询过程来说: a、普通索引,查到满足条件的第一个记录后,继续查找下一个记录,知道第一个不满足条件的记录 b、唯一索引,由于索引唯一性,查到第一个满足条件的记录后,停止检索 但是,两者的性能差距微乎其微...将change buffer中的操作应用到原数据页上,得到最新结果的过程,成为purge 访问这个数据页会触发purge,系统有后台线程定期purge,在数据库正常关闭的过程中,也会执行purge 唯一索引的更新不能使用...change buffer使用场景 在一个数据页做purge之前,change buffer记录的变更越多,收益就越大。...索引的选择和实践: 尽可能使用普通索引。 redo log主要节省的是随机写磁盘的IO消耗(转成顺序写),而change buffer主要节省的则是随机读磁盘的IO消耗。
mysqldump -h 192.168.1.117 -uroot -p123456 web fanwe_food_log_type > d:/dump.sql...
Join的使用 MySQL 的 JOIN 在两个或多个表中查询数据,Join包括三种: Inner Join:取多表的交集 Left Join:左表全取,将右表符合规则的数据拼接到左表 Right...不等于 在MySQL中通常使用代表不等于,通常用于Where子句 id 2 // 代表
根据单个字段 name 判断select count(name) as '重复次数',name from table group by name having count(*)>13、查找表中多余的重复记录
领取专属 10元无门槛券
手把手带您无忧上云