我有一个包含数百万条记录的数据库。 该表的结构如下:
表名:记录
Filed1:Name(varchar)(主键)
Field2:记录(int / bigint)
示例:
名称|记录
Darrin | 256亚伦| 3
达里尔| 12
...
我需要知道用户在排序记录中名称为'namex'的位置。
目前我实施此解决方案:
...
$name=namex;
$query= mysqli_query($mysqli,"SELECT Name FROM record ORDER BY Record DESC");
$x=0;
$rank=0;
if ($query->num_rows > 0) {
// output data of each row
while($row = $query->fetch_assoc()) {
if($row["Name"]==$name){
$rank=$x+1;
echo "Rank : $rank<br>";
break;
}
$x++;
}
}
...
凭借它和数据库中的100万条记录,答案大约需要4秒钟。
我试图在字段Record上放置一个表索引,但保持相同的性能。
如何减少执行时间?
答案 0 :(得分:1)
由于我不知道你正在使用什么DBMS(在使用mysql和sql-server的标签中......),你可以创建一个视图(对于SQL服务器必须是{{3} })或者用于mysql实现/模拟一种物化视图(具有更好的性能)。通过某些DBMS可以获得更好的性能。对于MySQL可能没有区别。
在视图中显示排名位置作为下面的查询(mysql示例):
CREATE VIEW ranked_record AS
SELECT
record.Name,
@curRank := @curRank + 1 AS rank
FROM
record,
(SELECT @curRank := 0) r
ORDER BY Record DESC;
或SQL server:
CREATE VIEW ranked_record AS
SELECT
record.Name,
row_number() over(ORDER BY record)
FROM
record;
然后运行您的查询:
SELECT name , rank FROM ranked_record WHERE name LIKE 'some name'
<强>更新
John评论之后,我意识到使用变量的视图中的错误。由于indexed view
,这是不可能的因此,您可以选择将其用作"feature/bug" of/from MySQL:
SELECT
name,
rank
FROM (
SELECT
record.Name,
@curRank := @curRank + 1 AS rank
FROM
record,
(SELECT @curRank := 0) r
) AS ranked_record
WHERE
name LIKE 'some name';
或者创建一个函数来计算视图中的排名(subquery in FROM clause):
CREATE FUNCTION `func_inc_var_session`() RETURNS int(11)
begin
SET @var := IFNULL(@var,0) + 1;
return @var;
端;
然后,像以前一样创建视图,只使用函数而不是变量:
CREATE VIEW ranked_record AS
SELECT
record.Name,
func_inc_var_session() as rank
FROM
record
ORDER BY Record DESC;
答案 1 :(得分:0)
我们可以在sql查询中编写它,而不是获取记录并在PHP中循环它。
select row = row_number() over( order by Record ) , * from record where name like 'namex'
答案 2 :(得分:-1)
我真的不明白为什么你知道列&#34; Name&#34;它是你的PK(唯一值)。
$name="Darrin";
$query= mysqli_query($db_connection, "SELECT COUNT(1) as rank FROM record WHERE Name = '".mysqli_real_escape_string($name)."' ORDER BY Record DESC");
$row = mysqli_fetch_row($query);
if ($query->num_rows > 0) {
echo "Rank : $row["rank"]<br>";
}