问答一下,轻松解决,电脑应用解决专家!
主板显卡CPU内存显示器
硬盘维修显卡维修显示器维修
注册表系统命令DOS命令Win8
存储光存储鼠标键盘
内存维修打印机维修
WinXPWin7Win10/Win11
硬件综合机箱电源散热器手机数码
主板维修CPU维修键盘鼠标维修
Word教程Excel教程PowerPointWPS
网络工具系统工具图像工具
数据库javascriptLinux系统
PHP教程CSS教程XML教程

mysql如何针对很长的字符串建立索引

更新时间:2021-09-02 12:23 作者:皮皮go点击:

今天面试,面试官出了一道题,一个表有urlrank两个字段,其中url代表的是链接,值唯一,如www.wd1x.com/1/2,rank代表的是这个链接的权重,范围在(1,10)。假如这张表中有1w条数据,现在要求给定一个url,如何查询到它的rank值。

很明显,这道题不是考sql语句的 。这道题考察的是索引。根据url,来查询rank,为了避免权标扫描,只能对url建立索引。可现在的问题时,这个url很长,如果直接对url建立索引,那么索引的维护是个很耗时的操作。因此,这道题考察的是如何对一个很长的字符串建立索引

方法1 :构造hash索引

既然url很长不适合建立索引,那么有没有可能把url转换成一个整数或者较短的字符串,然后对转换后的字段建立索引呢?这是我面试时首先想到的,利用hash函数,将url转换成一个整数。但这样做会有一个问题,hash冲突。换句话说,对于不同的url,利用hash函数转换后可能会得到同一个hash值。然后我就卡在这了,不知道怎么处理了。之后一直在考虑如何构造一个不产生hash冲突的函数。(很傻逼,对不对)。苦苦思考,无果而终,面试官就在旁边静静看着。然后我将问题重新捋了下,想着hash冲突既然很难避免,那就不管它了,如果查询结果只有一条,那就是没有产生hash冲突,返回结果即可。然后查询结果有多条记录,说明此时产生了hash冲突,我说再利用全表搜索。是的,你没听错,我又犯了一个很傻逼的错误。前半句没有问题,面试官听到我的后半句后,说产生hash冲突后那你直接在返回的结果里进行局部搜索不就行了。

参考答案

表结构如下图所示,其中url_hash字段由url通过hash函数生成得到。

SELECT rank FROM tableName WHERE url_hash=hash("www.wd1x.com/1/2") AND url="www.wd1x.com/1/2"
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
你可能感兴趣的内容