MySQL과 PHP에서 계산하기
콘텍스트:
- PHP/MySQL 어플리케이션이 있습니다.
- 계산의 일부는 SQL에서 직접 수행됩니다.예: 과거 24시간 동안 작성된 모든 사용자는 SQL 쿼리(NOW() – 1일)를 통해 반환됩니다.
동료 개발자와 저 사이에 다음과 같은 논의가 진행 중입니다.
A. 모든 계산/코드/논리를 PHP에 보관하고 MySQL을 정보의 '덤' 저장소로 취급합니다.
그의 의견:
B. 어떤 것이 더 쉽고 더 빠른지에 따라 믹스 앤 매치를 합니다.http://www.onextrapixel.com/2010/06/23/mysql-has-functions-part-5-php-vs-mysql-performance/
유지보수의 관점에서 보고 있습니다.그는 속도(기사에서 지적한 바와 같이 일부 작업은 MySQL에서 더 빠릅니다)를 검토하고 있습니다.
@bob-the-destroyer @tekretic @OMG 조랑말 @mu는 너무 짧다 @Tudor Constantin @tandu @Harley
효율적인 WHERE 절이 SQL 레벨에 속하는 것에 동의합니다(그리고 매우 명백합니다).그러나 다음과 같은 예는 어떻습니까?
- NOW()를 사용하여 24시간 동안 생성된 모든 사용자를 선택하기 위해 SQL에서 1일을 사용하여 24기간을 계산하시겠습니까?
- 모든 사용자의 이름과 성을 대문자로 표시하시겠습니까?
- 문자열을 연결하시겠습니까?
- (제군들?)
SQL 도메인에 속한 예를 지웁니다.
- 특정 WHERE 선택
- 중첩된 SQL 문
- 주문/정렬
- 고유 항목 선택
- 행/항목 카운트
각 시스템의 장점을 살리고 싶습니다.
로직을 집약, 결합 및 필터링하는 것은 분명히 데이터 계층에 속합니다.대부분의 DB 엔진이 10년 이상 최적화되어 있을 뿐만 아니라 DB와 웹 서버 간에 전송되는 데이터를 최소화할 수 있기 때문에 더 빠릅니다.
반면, 제가 사용한 대부분의 DB 플랫폼은 개별적인 가치로 작업하는 데 매우 부족한 기능을 가지고 있습니다.날짜 포맷이나 문자열 조작 같은 것은 SQL에서만 볼 수 있으므로 PHP에서 작업을 하는 것이 좋습니다.
기본적으로 각각의 시스템을 용도에 맞게 사용합니다.
유지보수의 관점에서 보면, 어디서 일어나는 일 사이에 명확한 구분이 있는 한, 이것들을 논리의 종류로 분리하는 것은 큰 문제를 일으키지 않을 것이며, 확실히 이익을 창출하기에 충분하지도 않을 것입니다.제 의견으로는 코드의 명확성과 유지보수는 모든 논리를 한 곳에 모으는 것보다 일관성에 더 가깝습니다.
참조: 구체적인 예...
네가 말하는 게 아니라는 건 알지만 데이트는 거의 특별한 경우야.시스템에서 생성된 모든 날짜가 웹 서버 또는 데이터베이스에 작성되었는지 확인해야 합니다.그렇지 않으면 db 서버와 웹 서버가 서로 다른 시간대에 대해 구성된 경우 몇 가지 악의적인 버그가 발생합니다(이러한 현상은 본 적이 있습니다).를 들면, ''나 '우리'나 '우리'나 '우리'나 '우리'나 '우리'나 '우리'나 '우리'나 '우리'나 '우리'나,
createdDate
이 " " "인getDate()
DB에 의해 삽입될 때 적용됩니다.레코드를 삽입하려면 PHP에서 생성된 날짜를 사용합니다(예:date("Y-m-d", time() - 3600)
최근 1시간 이내에 작성된 레코드를 선택합니다.을 사용법어느 레이어에서 해야 하는지, 예를 들어 컬럼 디폴트를 사용할 수 있는 DB를 선호합니다.대부분의 앱에서는 PHP로 이 작업을 수행합니다.이름과 성을 조합하는 것은 때때로 인사말, 직함, 중간 이니셜이 필요하다는 것을 깨닫기 전까지는 간단해 보인다.게다가, 유저의 이름, 성, 그리고 인사+이름+성 조합이 필요한 상황이 될 것이 거의 확실합니다.DB측을 연결하면 더 많은 데이터를 이동하게 됩니다. 하지만 실제로는 매우 작은 데이터입니다.
경우에 따라 다르지요.상기와 같이, 그것들을 개별적으로 사용하고 싶은 경우는, 퍼포먼스 면에서는 그것들을 개별적으로 꺼내, 필요에 따라서 접속하는 것이 좋습니다.즉, 취급하는 데이터 세트가 대규모가 아닌 한, 그 외의 요인(예: 유지 보수성)이 더 큰 영향을 미칠 수 있습니다.
몇 가지 경험적 규칙:
- 증분 ID는 DB에서 생성해야 합니다.
- 개인적으로는 DB에 의해 기본값이 적용된 것이 좋습니다.
- 선택할 때 레코드 수를 줄이는 작업은 DB에서 수행해야 합니다.
- 일반적으로 데이터 집합 DB 측의 크기를 줄이는 작업을 수행하는 것이 좋습니다(위의 문자열 예시와 같음).
- 주문, 집계, 서브쿼리, 조인 등은 항상 DB측이어야 합니다.
- 또, 이것에 대해서는 아직 이야기하지 않았지만, 트리거는 보통 나쁜/필요한 것입니다.
여기에는 고객이 직면한 몇 가지 중요한 단점이 있으며, 그 균형은 고객의 애플리케이션에 달려 있습니다.
SQL에서 항상 수행해야 하는 작업도 있습니다.SQL은 많은 작업에 대해 일부 예외(날짜 등)를 제외하면 매우 투박할 수 있으며 논리적으로 문제를 해결할 수 없습니다.코드베이스에서 특정 열에 대한 참조를 검색할 때(예를 들어) 보기 또는 저장 프로시저에 포함된 참조를 놓치기 쉽습니다.
성능은 항상 고려 사항이지만 앱과 구체적인 예에 따라 크게 고려되지 않을 수 있습니다.유지보수에 대한 우려와 아마도 매우 타당할 수 있으며, 앞서 언급한 성능상의 이점 중 일부는 매우 미미하므로 섣부른 최적화에 주의하시기 바랍니다.
또한 다른 시스템이 DB에 직접 액세스(예: 보고 또는 가져오기/내보내기)하는 경우 DB에 더 많은 논리가 있는 것이 좋습니다.예를 들어 다른 데이터 소스에서 직접 사용자를 Import할 경우 재사용 가능한 이메일 검증 기능이 SQL에 구현됩니다.
간단한 답변: 상황에 따라 다릅니다.:)
나는 바퀴를 재발명하는 것을 좋아하지 않는다.또, 필요한 작업에 최적인 툴을 사용하는 것을 좋아합니다.그 때문에, 다음과 같은 일이 있습니다.
- 를 바로 수 때는 단순한 이며, DB는 입니다.
WHERE
절을 클릭합니다.중 그 중 100명이 PHP에 도달했을 때, 이 일어날지 해 보세요.은 웹 하는 것이.PHP는 명입니다. - 두 개 이상의 테이블에서 데이터를 동시에 가져와야 할 경우 MySQL이 PHP보다 훨씬 우수합니다.
- 레코드를 카운트해야 할 경우 DB는 뛰어난 성능을 발휘합니다.
- FK 제약에 대한 애플리케이션 레벨 처리를 선호하는 경향이 있습니다.
- 또한 저장 프로시저를 피하고 애플리케이션 레벨에서 비즈니스 로직을 구현하는 것을 선호합니다(물론 대용량 데이터 세트에 대해서는 제외).
결론적으로, 저는 제시된 사례에서 당신의 동료가 옳다고 말하고 싶습니다.
논리의 절반은 데이터베이스에, 나머지 절반은 php에 넣으면 6개월 후에 변경을 가할 때 무슨 일이 일어나고 있는지 알아내는 데 두 배가 걸릴 것입니다.
단, 데이터베이스 쿼리는 필요한 데이터를 php에 제공할 수 있도록 충분한 논리를 가지고 있어야 합니다.만약 당신이 당신의 php 코드에 있는 수천 개의 mysql 레코드를 루프하고 있다면, 당신은 뭔가 잘못된 일을 하고 있는 것입니다.그러나 다른 쪽에서는 mysql 쿼리에 있는 문장이 실행 중이면 잘못된 작업도 하고 있습니다(아마도 쿼리를 다시 작성하기만 하면 됩니다).
스토어드 프로시저는 피하겠습니다이론적으로는 훌륭한 개념이지만, 보통 개발 시간이 훨씬 더 빠르며 php에서도 같은 결과를 얻을 수 있으며, 모든 논리가 어디에 있는지 알 수 있다는 이점도 있습니다.
MySQL은 결과 집합이 증가할수록 확장성이 향상됩니다.솔직히 데이터베이스를 "dumb data" 저장소로 취급하는 것은 리소스 낭비입니다.
보수성은 익숙함으로 인해 더럽혀지는 경향이 있습니다.PHP에 익숙하지 않다면 유지보수를 위한 초기 선택은 아니겠죠?
SQL에서 데이터를 가져오는 데 걸리는 시간은 시간이 많이 걸리지만 계산이 완료되면 더 비슷해집니다.데이터를 가져온 후에는 어느 쪽이든 시간이 많이 걸리지 않지만 SQL에서 스마트하게 수행하면 대규모 데이터 세트에 더 나은 결과를 얻을 수 있습니다.
MYSQL에서 데이터를 가져오고 가져온 데이터에 대해 PHP로 계산을 수행하는 경우, 필요한 결과를 가져오고 PHP 처리를 피하는 것이 훨씬 더 좋습니다. 시간이 더 많이 소요되기 때문입니다.
몇 가지 기본 사항:
MYSQL의 날짜 형식은 강력하며 대부분의 형식은 MYSQL에서 사용할 수 있습니다.특정 날짜 형식이 있으면 PHP를 사용할 수 있습니다.
문자열 조작은 SQL에서만 가능합니다.PHP에서 하는 것이 좋습니다.큰 문자열 조작이 필요하지 않은 경우 Mysql SELECTs에서 조작할 수 있습니다.
선택할 때 레코드 수를 줄이는 작업은 PHP가 아닌 SQL에서 수행해야 합니다.
데이터 주문은 항상 Mysql에서 수행해야 합니다.
DB 엔진은 이를 위해 특별히 설계되었기 때문에 집약은 항상 Mysql에서 수행해야 합니다.
하위 쿼리 및 결합은 항상 DB 측이어야 합니다.PHP 코드를 많이 줄일 수 있습니다.두 개 이상의 테이블에서 동시에 데이터를 가져와야 할 경우 SQL이 PHP보다 훨씬 좋습니다.
레코드를 계산하고 싶다면 SQL이 좋습니다.
각 항목에 대한 답변은 다음과 같습니다.
NOW()를 사용하여 24시간 동안 생성된 모든 사용자를 선택하기 위해 SQL에서 1일을 사용하여 24기간을 계산하시겠습니까?
PHP를 사용하여 날짜를 만들고 WHERE 절을 사용하여 데이터를 검색합니다.PHP에서 날짜 조작을 구현하는 것이 훨씬 빠릅니다.
모든 사용자의 이름과 성을 대문자로 표시하시겠습니까?
데이터베이스의 모든 사용자를 선택한 다음 PHP를 사용하여 문자열을 대문자로 지정합니다.PHP에서 구현하는 것이 훨씬 더 빠릅니다.
문자열을 연결하시겠습니까?
문자열 조작을 위한 PHP입니다.
(제군들?)
구현이 더 쉽기 때문에 모든 데이터 조작에 PHP를 사용합니다.쉽게 말하면 , , 조작, 조작.$variable
SQL 가가 sql sql sql가 php php PHP sql sql sql sql 。PHP에서 조작한 후 SQL에서 데이터베이스를 업데이트합니다.
SQL 도메인에 속한 예를 지웁니다.
특정 WHERE 선택 항목 - 예.
중첩된 SQL 문 - PHP 데이터 처리를 재평가합니다만, 필요하다면 괜찮습니다.
주문/정렬 - 주문은 SQL 문의 작업이지만 SELECT 문에 있을 때만 주문해야 합니다.데이터베이스 주문 및 업데이트와 같은 다른 주문은 PHP에 의해 주문되어야 합니다. 다시 말하지만 UPDATE SQL 문을 쓰는 것보다 $vars를 조작하는 것이 더 쉽기 때문입니다.
DISTING 항목 선택 - 예.
- 사용: "/" - ":$Number_Of_Results = count($Results);
PHP の php php php php php php php 。
언급URL : https://stackoverflow.com/questions/6449072/doing-calculations-in-mysql-vs-php
'programing' 카테고리의 다른 글
Apache Tomcat 응용 프로그램의 기본 세션 시간 초과 (0) | 2022.10.30 |
---|---|
for loop 끝에 있는 ";"의 목적은 무엇입니까? (0) | 2022.10.30 |
JavaScript 개체를 루프하거나 열거하려면 어떻게 해야 합니까? (0) | 2022.10.30 |
PHP/PDO MariaDB Galera 클러스터 (0) | 2022.10.30 |
Python에서는 argparse를 사용하여 양의 정수만 허용합니다. (0) | 2022.10.30 |