查询出重复记录
 
select * from 重复记录字段 in ( select 重复记录字段 form  数据表 group
by 重复记录字段 having count(重复记录字段)>1)

SQL Server 2016支持哈希查找,用户可以在内存优化表(Memory-Optimized
Table)上创建Hash Index,使用Hash
查找算法,实现数据的极速查找。在使用上,Hash Index
和B-Tree索引的区别是:Hash Index 是无序查找,Index
Key必须全部作为Filter,而B-Tree索引是有序查找,不需要Index
Key都作为Filter,只需要前序字段存在即可;在存储结构上,Hash
Index使用Hash Table实现,存在Hash
冲突,而B-Tree索引的结构是平衡树,存在页拆分,碎片问题。

解决方案:

一,Hash 查找算法

(1)
打开MySQL目录下的my.ini文件,在文件的最后添加一行“skip-grant-tables”,保存并关闭文件。(my.ini在C:\ProgramData\MySQL\MySQL
Server 5.7\my.ini)

在《数据结构》课程中,Hash查找的算法是:以关键字k为自变量,通过一个映射函数h,计算出对应的函数值y=h(k)(y称作哈希值,或哈希地址),根据函数值y,将关键字k存储在数组(bucket数组)所指向的链表中。在进行哈希查找时,根据关键字,使用相同的函数h计算哈希地址h(k),然后直接寻址相应的Hash
bucket,直接到对应的链表中取出数据。因此,Hash 查找算法的数据结构由Hash
Bucket数组,映射函数f和数据链表组成,通常将Bucket数组和数据链表称作Hash
Table,如图,Hash Table由5个buckets和7个数据结点组成:

图片 1

图片 2

(2)重启MySQL服务。

哈希查找的时间复杂度是O(n/m),n是指数据结点的数量,m是bucket的数量,在理想情况下,Hash
Bucket足够多,Hash函数不产生重复的Hash
Value,哈希查找的时间复杂度最优到达O(1),但是,在实际应用中,哈希函数有一定的几率出现重复的哈希地址,产生哈希冲突,时间复杂度会低于O(n/m);在最差的情况下,时间复杂度是O(n)。

(3)通过命令行进入MySQL的BIN目录,输入“mysql
-u root -p”(不输入密码),回车即可进入数据库。

二,Hash Index的结构

C:\Program Files\MySQL\MySQL Server
5.7\bin>

Hash Index使用Hash查找算法实现,SQL Server内置Hash函数,用于所有的Hash
Index,因此,Hash Index就是Hash Table,由Hash
Buckets数组和数据行链表组成。创建Hash Index时,通过Hash函数计算Index
Key的Hash地址,Hash地址不同的数据行指向不同的Bucket,Hash地址相同的数据行指向相同的Bucket,如果多个数据行的Hash地址相同,都指向同一个Bucket,那么将这些数据行链接在一起,组成一个链表。

(4)执行“use
mysql;”,使用mysql数据库。

A hash index consists of an array of
pointers, and each element of the array is called a hash bucket. The
index key column in each row has a hash function applied to it, and the
result of the function determines which bucket is used for that row. All
key values that hash to the same value (have the same result from the
hash function) are accessed from the same pointer in the hash index and
are linked together in a chain. When a row is added to the table, the
hash function is applied to the index key value in the row. If there is
duplication of key values, the duplicates will always generate the same
function result and thus will always be in the same chain.

图片 3

举例说明,假定哈希函数是h(k)=Length(k),用于计算Index
Key的字符个数,在内存优化表(Name,City)上创建Hash Index,Index
ptr指向链表中的下一个数据行,如果没有下一个数据行,那么该指针为NULL:

(5)执行“update user set
authentication_string=password(‘xxxx’) where User=’root’;
(修改root的密码)

图片 4

图片 5

1,以Name为Index Key创建Hash Index

(6)分配权限

第一个数据行的Name是“Jane”,HashValue是4,将该行数据映射到下标为4的Bucket中(Bucket数组的第五个元素),由于该数据行是第一个数据结点,Index
ptr为NULL。

 grant all privileges on *.* to root@localhost identified by “xxxx” ;

 图片 6

(7)打开MySQL目录下的my.ini文件,删除最后一行的“skip-grant-tables”,保存并关闭文件。

第二个数据行,Name值是“Greg”,HashValue是4,映射到下标为4的Bucket中,和第一个数据行链接在一起,组成一个链表(Chain),插入数据结点时,使用头部插入法,新的数据节点作为头结点,将头节点的Index
ptr(next
pointer)指针指向数据链表的第一个数据结点,如图,新的头结点“Greg”的Index
ptr指向第一个数据行“Jane”。

(8)重启MySQL服务。

 图片 7

(9)在命令行中输入“mysql -u root -p
xxxx”,即可成功连接数据库。

2,创建第二个Hash Index,以City为Index Key

当创建第二个Hash Index时,每个数据行结构中包含两个Index
ptr指针,都用于指向下一个数据节点(Next Pointer):第一个Index
ptr用于Index Key为Name的Hash Index,当出现相同的Hash
Value时,该指针指向链表中下一个数据行,使数据行链接到一起组成链表;第二个Index
ptr用于Index Key为City的Hash Index,指向链表中下一个数据行。

发表评论

电子邮件地址不会被公开。 必填项已用*标注