1. 程式人生 > >按QQ查詢QQ群資料庫的方法

按QQ查詢QQ群資料庫的方法

1.為所有的表建立索引

    ADD INDEX `QunNum_index` (`QunNum`);
    ADD INDEX `QQNum_index` (`QQNum`)  ;

2.建立儲存過程

CREATE DEFINER=`root`@`localhost` PROCEDURE `SearchByQQ`(IN `qq` int)
BEGIN
    DECLARE i int;
    DECLARE tblname VARCHAR(10);    
    DECLARE sql_text VARCHAR(1000);

    DROP TABLE IF EXISTS `temp`
;
CREATE TABLE `temp`(QQNum int,nick varchar(100),QunNum int) ENGINE=MEMORY; SET i=1; WHILE i<1100 DO SET tblname=CONCAT('group',i); SET sql_text=concat('insert into `temp` select QQNum,nick,QunNum from ' , tblname , ' where QQNum=' , qq , ';'); SET @sql_text=sql_text;
PREPARE stmt FROM @sql_text; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET i=i+1; END WHILE; SELECT * FROM `temp`; END

3.編寫PHP

趕時間,瞎寫的。
<?php
set_time_limit(60);
?>
<!DOCTYPE html>
<html>
<head>
   <title>QQGroup Search System v1.0
</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-with,initial-scal=1"> <link href="bootstrap.min.css" rel="stylesheet"> </head> <body> <div style='width:75%;margin:0 auto;'> <form class="form-inline" role="form" action="" method="get" style="margin-bottom:10px;"> <div class="form-group"> <input type="input" class="form-control" name="qun" id="qun" placeholder="請輸入QQ群號碼" value=""> <input name="sbmt" type="submit" class="btn btn-primary"> </div> </form> <?php if(intval($_GET['qun'])>100000) { @mysql_connect("localhost", "root", "123456"); @mysql_select_db("QQGroupInfo"); mysql_query("set names utf8"); $qun=intval($_GET['qun']); $sql="select * from QQGroupInfo.qunlist".CEIL($qun/1000000)." where QunNum=$qun"; $rs=mysql_query($sql) or die(mysql_error()); $r=mysql_fetch_assoc($rs); if($r) { echo "<table class='table table-striped table-bordered'>"; echo "<tr><td colspan='10'>QQ群號:{$r['QunNum']}<br>\r\n"; echo "QQ名稱:{$r['Title']}<br>\r\n"; echo "QQ簡介:{$r['QunText']}<br>\r\n"; $sql="select * from QQGroupDetail.group".CEIL($qun/100000)." where QunNum=$qun"; $rs=mysql_query($sql) or die(mysql_error()); echo "群 人 數:".mysql_num_rows($rs); echo "</td></tr><tr>"; while($r=mysql_fetch_assoc($rs)) { $i++; echo "<td align='center'><a href='?qq={$r['QQNum']}'>{$r['QQNum']}</a><br>{$r['Nick']}</td>"; if($i%10==0) echo "</tr>\r\n\t<tr>"; } echo "\t</tr>\r\n</table>"; } } elseif(intval($_GET['qq'])>10000) { define('CLIENT_MULTI_RESULTS', 131072);//這兩行是使用儲存過程的關鍵地方 @mysql_connect("localhost", "root", "123456",true,CLIENT_MULTI_RESULTS); @mysql_select_db("QQGroupDetail"); //資料庫庫名名 mysql_query("set names utf8"); $qq=intval($_GET['qq']); $rs=mysql_query("call SearchByQQ($qq);") or die(mysql_error()); echo "<table class='table table-striped table-bordered table-hover'>"; echo "<tr><td>QQ號碼</td><td>暱稱</td><td>群號碼</td></tr>"; while($r=mysql_fetch_assoc($rs)) { echo "<tr><td>{$r['QQNum']}</td><td>{$r['nick']}</td><td><a href='?qun={$r['QunNum']}'>{$r['QunNum']}</a></td></tr>"; } echo "</table>"; } ?> </div> </body> </html>

4.總結

在VPS上,在1100個表上查詢QQ加入的QQ,大約需要20s,如果是SSD應該在幾秒內。
嘗試使用Sphinx全文索引,發現需要50多G……放棄了。
還有一種方法,空間換效率,提前把每個QQ號加入的群查出來放到一個表裡。