如何实现十几万条数据的最快查找

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何实现十几万条数据的最快查找相关的知识,希望对你有一定的参考价值。

参考技术A 你说的是算法吧,具体是什么样的数据?
分几种情况:
1、只需要查找一次,那就直接遍历一次。
2、需要多次查找,查找次数可以与数据总数相比,那就可以先排序后二分查找(如果可排序的话)。也可以建立一个哈希表(如果是整数、字符串等等),实现O(1)的查找。
实际情况是,不需要你自己造轮子,多数编程语言有封装好的数据结构拿来直接用。比如C++ STL的 set 和 unordered_set 存储不重复的数据;map 和 unordered_map 存储有重复的数据(数据为键,出现次数为值),这都比你自己写要快。本回答被提问者采纳
参考技术B 可以帮你找 具体要求 你说

十几万条数据的表中,基于帝国cms 。自己亲身体验三种批量更新数据的方法,每一种的速度是什么样的

需求是 上传Excel 读取里面的数据。根据Excel中某一个字段,与数据表中的一个字段的唯一性。然后把 Excel表中数据和数据库表中数据一次更改。本次测试一次更新31条数据。 本次测试基于帝国cms 

方法1 用一个for徐循环把读取的数据放在一个数组中然后在十几万条的数据表中逐条查询更改,用时35s;

$numArr = count($arr);
$m = ceil($numArr/10000);
for($i=1;$i<=$numArr;$i++){
$n = $i*10000;
$j = $n-10000;
for($q=$j;$q<$n;$q++){
$res = $empire->query("update {$dbtbpre}enewsclass set bname=‘".$arr[$i][1]."‘,classpagekey=‘".$arr[$i][2]."‘,intro=‘".$arr[$i][3]."‘ where classpath=‘".$arr[$i][i]."‘");
if($res){
echo "更新成功!路径信息为:".$arr[$i][0];
}
}
}

方法 二;创建临时表。用时23s

$sqls ="DROP TABLE IF EXISTS `linshitbale`;\\n";
$sqls .="create Temporary table linshitbale (id int(11) primary key auto_increment,classpath varchar(255),bname varchar(255),intro varchar(255),classpagekey varchar(255));\\n";
$bsql ="";
foreach ($arr as $k => $v) {
$k+=1;
$bsql .="(".$k.",‘".$v[0]."‘,‘".$v[1]."‘,‘".$v[3]."‘,‘".$v[2]."‘),";
}
$bsql = trim($bsql,",");
$sqls .= "insert into linshitbale values ".$bsql.";\\n";

$sqls .= "update {$dbtbpre}enewsclass as c,linshitbale as ls set c.bname=ls.bname,c.intro=ls.intro,c.classpagekey=ls.classpagekey where c.classpath = ls.classpath;";

echo $sqls;

技术图片

第三种方法 :稍加修改批量更新的方法。用时0.9s

 

UPDATE mytable
 SET myfield1 = CASE id
 WHEN 1 THEN ‘myvalue11‘
 WHEN 2 THEN ‘myvalue12‘
 WHEN 3 THEN ‘myvalue13‘
 END,
 myfield2 = CASE id
 WHEN 1 THEN ‘myvalue21‘
 WHEN 2 THEN ‘myvalue22‘
 WHEN 3 THEN ‘myvalue23‘
 END
WHERE id IN (1,2,3)

$classpath = array();
$bname = array();
$intro = array();
$classpagekey = array();
foreach ($arr as $key => $value) {
$classpath[] = $value[0];
$bname[] = $value[1];
$intro[] = $value[3];
$classpagekey[] = $value[2];
}

$classpaths = implode("‘,‘", array_values($classpath));
$classpaths = "‘".$classpaths."‘";
$sql = "UPDATE {$dbtbpre}enewsclass\\n SET bname = CASE classpath \\n";
foreach ($bname as $k=>$v) {
$sql .= sprintf("WHEN ‘%s‘ THEN ‘%s‘ \\n", $classpath[$k], $v);
}
$sql .= " END,\\n intro = CASE classpath \\n";
foreach ($intro as $key1 => $value1) {
$sql .=sprintf("WHEN ‘%s‘ THEN ‘%s‘ \\n",$classpath[$key1],$value1);
}
$sql .= " END,\\n classpagekey = CASE classpath \\n";
foreach ($classpagekey as $key2 => $value2) {
$sql .=sprintf("WHEN ‘%s‘ THEN ‘%s‘ \\n",$classpath[$key2],$value2);
}
$sql .= " END\\n WHERE classpath IN ($classpaths)";


$result = $empire->query("$sql");
if($result){
echo "success";
}else{
echo "error";
}

技术图片

如有不懂可以私聊我。qq 517190435

以上是关于如何实现十几万条数据的最快查找的主要内容,如果未能解决你的问题,请参考以下文章

oracle导出1000万条数据应该如何实现

iOS实现包含100万条数据的视图顺滑滚动和闪电跳转到任意页面

iOS实现包含100万条数据的视图顺滑滚动和闪电跳转到任意数据对应的页面

iOS实现包含100万条数据的视图顺滑滚动和闪电跳转到任意数据对应的页面

java 中 list集合中有几十万条数据,每100条为一组取出来如何实现,求代码!!!

查找范围内元素数量的最快方法