MySQL 데이터베이스에 DATA INFILE을 로드하기 위해 매일 실행되는 cron 스크립트가 있습니다. 웹 애플리케이션의 일부로 PHP를 사용하여 지난 7일 동안 삽입된 총 레코드 수를 보여주는 주간 보고서를 생성하고 싶습니다.
이 문제를 해결하는 가장 좋은 방법을 알고 싶습니다. MySQL을 패치하거나 수정하는 것은 선택 사항이 아니며 데이터가 삽입되는 방식을 변경하는 것도 아닙니다. 이 데이터를 PHP로 다시 읽는 것은 지저분할 수 있으므로 삽입하기 전에 CSV 파일 수를 세는 것을 피하는 것이 좋습니다.
제안?
답변1
PHP 앱 내부에 있어야 합니까? cron 스크립트 내에서 삽입할 행 수를 계산하고 이를 로그 파일이나 mysql db 내부의 작은 로그 테이블에 추가할 수 있습니다(mysql을 수정한다는 의미가 아닌 경우). 확실하지는 않지만 myql 함수 row_count()가 INFILE 데이터에서도 작동하므로 숫자를 계산하는 것이 쉬울 것 같습니다.
그리고 아마도 가장 간단한 방법은 삽입 후 행이 수정되지 않은 경우 데이터베이스에 타임스탬프 열을 추가할 수 있습니다. 그러면 자동으로 삽입 날짜로 설정되고 일주일 동안 숫자가 count() 증가됩니다.
답변2
LOAD DATA INFILE 쿼리를 실행한 후 즉시 PHP mysql_info() 함수를 사용하세요. 그러면 다음과 같은 문자열이 반환됩니다.
기록: 1 삭제: 0 건너뛰기: 0 경고: 0
보다PHP 함수 참조: mysql_info() 관련은mysql_affected_rows()기능.
무엇을 하든 SHOW TABLE STATUS의 행 수에 의존하지 마세요. 이는 스토리지 엔진에 따라 매우 부정확할 수 있으며 쿼리 최적화 프로그램이 최적화에 대해 더 나은 판단을 내리는 데만 유용합니다. 이것은 문서화되어 있습니다테이블 상태 표시(여기에 인용된 특정 섹션 포함)
행
행 수입니다. MyISAM과 같은 일부 스토리지 엔진은 정확한 개수를 저장합니다. InnoDB와 같은 다른 스토리지 엔진의 경우 이 값은 근사치이며 실제 값과 최대 40~50%까지 달라질 수 있습니다. 이러한 경우 정확한 개수를 얻으려면 SELECT COUNT(*)를 사용하십시오.
INFORMATION_SCHEMA 데이터베이스의 테이블에 대한 행 값은 NULL입니다.
답변3
관심 있는 것이 특정 스키마와 테이블의 행 수에만 있다면(그리고 행 삭제가 없다고 가정할 경우) MySQL 명령을 사용 show table status
하거나 명령줄에서 use 를 사용할 수 있습니다 mysqlshow --status dbname
. 그러면 스키마의 각 테이블에 대해 행 수를 포함한 일부 확장 정보가 나열됩니다(또는 like
특정 테이블을 선택하는 데 사용할 수 있음).
INFORMATION_SCHEMA 데이터베이스에서 간단한 SQL을 사용하여 다음과 같이 동일한 데이터를 검색할 수 있습니다.
SELECT Table_name,SUM(Table_rows) FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME in ('table1','table2');
하루에 한 번 이 스냅샷을 찍는 간단한 cron 작업을 만들 수 있으며, 그러면 PHP에서 유용한 방법으로 해당 데이터를 추출하는 것이 상당히 쉬워집니다. 도대체 데이터베이스 테이블에 저장할 수도 있습니다 ;-)