MySQL中如何设置唯一索引,联合索引?

MySQL中如何设置唯一索引,联合索引?,第1张

1.UNIQUE 关键字建唯一索引\x0d\x0amysql>CREATE TABLE `wb_blog` ( \x0d\x0a-> `id` smallint(8) unsigned NOT NULL, \x0d\x0a-> `catid` smallint(5) unsigned NOT NULL DEFAULT '0', \x0d\x0a-> `title` varchar(80) NOT NULL DEFAULT '', \x0d\x0a -> `content` text NOT NULL, \x0d\x0a -> PRIMARY KEY (`id`), \x0d\x0a-> UNIQUE KEY `catename` (`catid`) \x0d\x0a->) \x0d\x0a如果建好表了,可以用以下语句建\x0d\x0a mysql>CREATE UNIQUE INDEX catename ON wb_blog(catid) \x0d\x0a\x0d\x0a2.联合索引\x0d\x0aALTER TABLE `tasks`\x0d\x0aADD INDEX `testabc` (`title`, `created`) \x0d\x0a\x0d\x0a3联合唯一索引(假设有这个需求,在同一天内不能建两个tiltle一样的任务)\x0d\x0aALTER TABLE `tasks`\x0d\x0aADD UNIQUE INDEX `testabc` (`title`, `created`) \x0d\x0a\x0d\x0a数据库建索引的科学性事关数据库性能,索引也不是越多越好。

常见的索引类型:哈希表、有序数组、搜索树。

mysql之普通索引和唯一索引。

执行查询的语句是 select id from T where k=5

这个查询语句在索引树上查找的过程,先是通过 B+ 树从树根开始,按层搜索到叶子节点,也就是图中右下角的这个数据页,然后可以认为数据页内部通过二分法来定位记录。

InnoDB的索引组织结构:

change buffer:持久化的数据。InnoDB将更新 *** 作缓存在 change buffer中,也就是说,change buffer 在内存中有拷贝,也会被写入到磁盘,主要节省的则是随机读磁盘的IO消耗。

change buffer 只限于用在普通索引的场景下,而不适用于唯一索引.

merge:将 change buffer 中的 *** 作应用到原数据页,得到最新结果的过程。

merge执行流程:

1、从磁盘读入数据页到内存

2、从change buffer里找出这个数据页的change buffer记录,依次应用,得到新版数据页

3、写redo log,这个redo log包含了数据的变更和change buffer的变更。

change buffer 用的是 buffer pool 里的内存,因此不能无限增大。change buffer 的大小,可以通过参数 innodb_change_buffer_max_size=50 表示 change buffer 的大小最多只能占用 buffer pool 的 50%。

如果要在这张表中插入一个新记录 (4,400) 的话,InnoDB 的处理流程是怎样的。

第一种情况是,这个记录要更新的目标页在内存中

这时,InnoDB 的处理流程如下:

第二种情况是,这个记录要更新的目标页不在内存中

这时,InnoDB 的处理流程如下:

mysql>insert into t(id,k) values(id1,k1),(id2,k2)当前 k 索引树的状态,查找到位置后,k1 所在的数据页在内存 (InnoDB buffer pool) 中,k2 所在的数据页不在内存中。

分析这条更新语句,你会发现它涉及了四个部分:内存、redo log(ib_log_fileX)、 数据表空间(t.ibd)、系统表空间(ibdata1)。这条更新语句做了如下的 *** 作(按照图中的数字顺序):

带change buffer的更新过程:

select * from t where k in (k1, k2) ,如果读语句发生在更新语句后不久,内存中的数据都还在,那么此时的这两个读 *** 作就与系统表空间(ibdata1)和 redo log(ib_log_fileX)无关了.

一、使用不同:

主键索引是在创建主键时一起创建的,是基于主键约束而建立的,是不可以为空,也不可以重复。

唯一索是引基于唯一约束而建立的,可以为空不可以重复,主键索引本身就具备了唯一索引的功能。

二、作用不同:

唯一索引的作用跟主键的作用一样。不同的是,在一张表里面只能有一个主键,主键不能为空,唯一索引可以有多个,唯一索引可以有一条记录为空,即保证跟别人不一样就行。

比如学生表,在学校里面一般用学号做主键,身份z则弄成唯一索引;而到了教育局,他们就把身份z号弄成主键,学号换成了唯一索引。

三、定义不同:

普通索引:这是最基本的索引类型,而且它没有唯一性之类的限制。

唯一性索引:这种索引和前面的“普通索引”基本相同,但有一个区别:索引列的所有值都只能出现一次,即必须唯一。

扩展资料:

要对一个表建立唯一索引,可以使用关键字UNIQUE。对聚簇索引和非聚簇索引都可以使用这个关键字。

例子

CREATE UNIQUE CLUSTERED INDEX myclumn_cindex ON mytable(mycolumn)

其中:CLUSTERED INDEX是用来建立聚簇索引的关键字,此语句的意思是在表mytable上的mycolumn字段上创建一个名为myclumn_cindex的聚簇索引,且为唯一索引。

参考资料来源:百度百科-唯一索引


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/7190675.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-02
下一篇 2023-04-02

发表评论

登录后才能评论

评论列表(0条)

保存