Milion Record Sql Order By和count rows

时间:2016-10-28 15:58:29

标签: mysql sql performance

我有一个包含数百万条记录的数据库。 该表的结构如下:

表名:记录

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上放置一个表索引,但保持相同的性能。

如何减少执行时间?

3 个答案:

答案 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>";
}