수만 개의 데이터가 있는 데이터베이스를 테스트해야 합니다. 한 번에 수백 개의 정보를 업데이트하려면 어떻게 PHP 파일을 작성해야 합니까? 시간이 있으므로 WHILE을 사용하여 작성하는 방법을 알고 있습니다. 좋습니다. 하나의 업데이트가 100개의 데이터와 같다면 어떻게 작성합니까? 정답은 MySQL rand 함수를 사용하는 것입니다. UPDATE cdb_posts SET views = rand(); 그런데 다음과 같이 mysql rand 함수의 몇 가지 예를 찾아보겠습니다. 그런 다음 insert 명령에 rand()를 사용합니다. (), 필드에 주의하세요 너비가 충분합니까? 저는 항상 mysql이 몇 가지 데이터 조각을 무작위로 쿼리한다고 생각했기 때문에 SELECT * FROM `table` ORDER BY RAND() LIMIT 5
를 사용하십시오.
그게 다야.
그러나 실제 테스트를 해본 결과 이는 매우 비효율적이라는 것을 알았습니다. 150,000개 이상의 항목이 있는 데이터베이스의 경우 5개의 데이터를 쿼리하는 데 8초 이상이 소요됩니다. 공식 매뉴얼을 확인하면 ORDER BY 절에서 rand()가 여러 번 실행된다고 하는데 이는 매우 자연스럽습니다. 무능한. .
구글 검색 기본적으로는 인터넷에서 max(id) * rand()를 쿼리해서 무작위로 데이터를 얻을 수 있습니다.
SELECT * FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM `table`)) AS id) AS t2 WHERE t1.id >= t2.id ORDER BY t1.id ASC LIMIT 5;
그런데 이렇게 하면 5연속 기록이 나옵니다. 해결책은 한 번에 하나의 쿼리만 5번 쿼리하는 것입니다. 그럼에도 불구하고 150,000개의 항목이 있는 테이블을 쿼리하는 데 0.01초도 걸리지 않으므로 그만한 가치가 있습니다. 위의 문은 JOIN을 사용하고 있으며, mysql 포럼의 누군가가 이를 사용하고 있습니다
SELECT * FROM `table` WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` ) ORDER BY id LIMIT 1;
테스트해봤는데 0.5초도 안걸리고 속도도 좋은데 위의 설명과 아직 격차가 크네요. 나는 항상 뭔가가 정상이 아닌 것 같은 느낌이 든다. 그래서 문장을 바꿔봤습니다.
SELECT * FROM `table` WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `table`))) ORDER BY id LIMIT 1;
이제 다시 효율성이 향상되어 쿼리 시간은 0.01초에 불과합니다. 마지막으로 문을 개선하고 MIN(id)의 판단을 추가하겠습니다. 처음 테스트했을 때 테이블의 처음 몇 행이 항상 절반의 시간 동안 쿼리되는 것은 MIN(id) 판단을 추가하지 않았기 때문입니다.
전체 쿼리 문은 다음과 같습니다.
SELECT * FROM `table` WHERE id >= (SELECT floor( RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) + (SELECT MIN(id) FROM `table`))) ORDER BY id LIMIT 1; SELECT * FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`))+(SELECT MIN(id) FROM `table`)) AS id) AS t2 WHERE t1.id >= t2.id ORDER BY t1.id LIMIT 1;
마지막으로 이 두 문을 각각 PHP에서 10번 쿼리합니다.
전자는 0.147433초가 소요됩니다
후자는 0.015130초가 소요됩니다
위는 MySQL rand 함수가 난수를 구현하는 방법입니다.