developer tip

n 개의 마지막 행에서 mysql 선택

copycodes 2020. 11. 17. 08:19
반응형

n 개의 마지막 행에서 mysql 선택


인덱스 (자동 증가)와 정수 값이있는 테이블이 있습니다. 테이블의 길이는 수백만 행입니다.

테이블의 마지막 n 개 행에 특정 숫자가 가장 효율적으로 나타나는지 어떻게 검색 할 수 있습니까?


@chaos가 제공 한 답변 에서 시작 하지만 몇 가지 수정 사항이 있습니다.

  • 을 사용하는 ORDER BY경우 항상 사용해야 합니다 LIMIT. RDBMS 테이블에 대해 보장되는 암시 적 순서는 없습니다. 당신은 할 수 있습니다 일반적으로 기본 키의 순서로 행을 얻을 수 있지만, 당신은이에 의존 할 수 없으며 휴대용입니다.

  • 내림차순으로 정렬하는 경우 테이블의 행 수를 미리 알 필요가 없습니다.

  • 파생 테이블에 상관 이름 (일명 테이블 별칭)을 제공해야 합니다.

내 버전의 쿼리는 다음과 같습니다.

SELECT `id`
FROM (
    SELECT `id`, `val`
    FROM `big_table`
    ORDER BY `id` DESC
    LIMIT $n
) AS t
WHERE t.`val` = $certain_number;

매우 늦은 답변 일 수 있지만 이것은 훌륭하고 간단합니다.

select * from table_name order by id desc limit 5

이 쿼리는 테이블에 삽입 한 마지막 5 개 값 (마지막 5 개 행) 집합을 반환합니다.


mysql에서 마지막 5 개 행 검색

이 쿼리는 완벽하게 작동합니다.

SELECT * FROM (SELECT * FROM recharge ORDER BY sno DESC LIMIT 5)sub ORDER BY sno ASC

또는

select sno from(select sno from recharge order by sno desc limit 5) as t where t.sno order by t.sno asc

페이지 매김과 마찬가지로 SORT 및 LIMIT를 활용하십시오. i 번째 행 블록을 원하면 OFFSET을 사용하십시오.

SELECT val FROM big_table
where val = someval
ORDER BY id DESC
LIMIT n;

Nir에 대한 응답 : 정렬 작업이 반드시 불이익을받는 것은 아니며 쿼리 플래너가 수행하는 작업에 따라 다릅니다. 이 사용 사례는 페이지 매김 성능에 중요하므로 몇 가지 최적화가 있습니다 (위 링크 참조). 이것은 postgres에서도 마찬가지입니다. "ORDER BY ... LIMIT는 정렬없이 수행 될 수 있습니다 . " E.7.1. 마지막 글 머리 기호

explain extended select id from items where val = 48 order by id desc limit 10;
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref   | rows | Extra       |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
|  1 | SIMPLE      | items | const | PRIMARY       | PRIMARY | 4       | const |    1 | Using index | 
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+

자동 증가이기 때문에 여기에 내 의견이 있습니다.

Select * from tbl 
where certainconditionshere 
and autoincfield >= (select max(autoincfield) from tbl) - $n

이것이 조금 오래되었을 수 있다는 것을 알고 있지만 PDO::lastInsertId. 나는 그것이 당신이 원하는 것을 수행한다고 생각하지만 PDO를 사용하려면 응용 프로그램을 다시 작성해야 할 것입니다 (공격에 대해 훨씬 안전합니다)

참고 URL : https://stackoverflow.com/questions/573646/mysql-select-from-n-last-rows

반응형