Mysql 성능 최적화 20 원칙 (3)
12. Prepared Statements
Prepared Statements 는 저장 과정 과 같 습 니 다. 배경 에서 실행 되 는 SQL 문 구 를 집합 하 는 것 입 니 다. 저 희 는 prepared statements 를 사용 하여 성능 문제 든 안전 문제 든 많은 장점 을 얻 을 수 있 습 니 다.
Prepared Statements 는 연 결 된 변 수 를 검사 할 수 있 습 니 다. 그러면 프로그램 이 'SQL 주입 식' 공격 을 받 지 않도록 보호 할 수 있 습 니 다.물론 이 변 수 를 수 동 으로 검사 할 수도 있 지만 수 동 검 사 는 문제 가 생기 기 쉬 우 며 프로그래머 에 게 잊 혀 지 는 경우 가 많다.우리 가 프레임 워 크 나 ORM 을 사용 할 때 이런 문제 가 좋 을 것 이다.
성능 에 있어 서 같은 조회 가 여러 번 사 용 될 때 이것 은 당신 에 게 상당 한 성능 우 위 를 가 져 다 줄 것 입 니 다.이 Prepared Statements 에 인 자 를 정의 할 수 있 으 며, MySQL 은 한 번 만 해석 할 수 있 습 니 다.
최신 버 전의 MySQL 은 Prepared Statements 를 전송 하 는 데 바 이 너 리 형 세 를 사용 하기 때문에 네트워크 전송 이 매우 효율 적 입 니 다.
물론 캐 시 조회 가 지원 되 지 않 기 때문에 Prepared Statements 를 사용 하 는 것 을 피해 야 하 는 경우 도 있 습 니 다.하지만 버 전 5.1 이후 지원 했다 고 합 니 다.
PHP 에서 prepared statements 를 사용 하려 면 사용 매 뉴 얼 을 볼 수 있 습 니 다: my sql 확장 또는 데이터베이스 추상 층 을 사용 합 니 다. 예 를 들 어 PDO.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// prepared statement
if
(
$stmt
=
$mysqli
->prepare(
"SELECT username FROM user WHERE state=?"
)) {
//
$stmt
->bind_param(
"s"
,
$state
);
//
$stmt
->execute();
//
$stmt
->bind_result(
$username
);
//
$stmt
->fetch();
printf(
"%s is from %s
"
,
$username
,
$state
);
$stmt
->close();
}
13. 버퍼 없 는 검색
정상 적 인 상황 에서 스 크 립 트 에서 SQL 문 구 를 실행 할 때 이 SQL 문 구 를 되 돌려 주지 않 을 때 까지 프로그램 을 멈 추고 프로그램 을 계속 실행 합 니 다.너 는 버퍼 없 는 조 회 를 사용 해서 이 행동 을 바 꿀 수 있다.
이 일 에 대하 여 PHP 문서 에 아주 좋 은 설명 이 있 습 니 다. mysql_unbuffered_query() 함수:
“mysql_unbuffered_query() sends the SQL query query to MySQL without automatically fetching and buffering the result rows as mysql_query() does. This saves a considerable amount of memory with SQL queries that produce large result sets, and you can start working on the result set immediately after the first row has been retrieved as you don’t have to wait until the complete SQL query has been performed.”
위의 그 말 은 'my sql' 로 번역 되 었 다.unbuffered_query () mysql 이 아 닌 MySQL 로 SQL 문 구 를 보 냅 니 다.query () 와 마찬가지 로 fethch 와 캐 시 결 과 를 자동 으로 가 져 옵 니 다.이것 은 상당 한 메모 리 를 절약 할 수 있 습 니 다. 특히 대량의 결 과 를 가 져 올 수 있 는 검색 어 입 니 다. 그리고 모든 결과 가 돌아 올 때 까지 기다 릴 필요 가 없습니다. 첫 번 째 줄 의 데이터 가 돌아 올 때 바로 검색 결 과 를 시작 할 수 있 습 니 다.
그러나 이 는 한계 가 있다.모든 줄 을 읽 거나 다음 검색 을 하기 전에 호출 해 야 하기 때문이다. mysql_free_result() 결과 지우 기.그리고 mysql_num_rows() 혹시 mysql_data_seek() 사용 할 수 없습니다.따라서 버퍼 없 는 조 회 를 사용 할 지 여 부 는 자세히 고려 해 야 한다.
14. IP 주 소 를 UNSIGNED INT 로 저장
많은 프로그래머 들 이 성형 IP 가 아 닌 문자열 형식의 IP 를 저장 하기 위해 VARCHAR (15) 필드 를 만 듭 니 다.성형 으로 저장 하려 면 4 개의 바이트 만 필요 하 며, 일정한 필드 를 가 질 수 있다.그리고 이것 은 당신 에 게 조회 상의 장점 을 가 져 다 줄 것 입 니 다. 특히 이러한 WHERE 조건 을 사용 해 야 할 때: IP between ip1 and ip2.
IP 주 소 는 전체 32 비트 의 부호 없 는 성형 을 사용 하기 때문에 UNSIGNED INT 를 사용 해 야 합 니 다.
당신 의 조 회 는 사용 할 수 있 습 니 다. INET_ATON() 문자열 IP 를 성형 으로 바 꾸 고 사용 합 니 다. INET_NTOA() 하나의 성형 을 문자열 IP 로 변환 합 니 다.PHP 에 도 이런 함수 가 있 습 니 다. ip2long() 화해시키다 long2ip()。
1
$r
=
"UPDATE users SET ip = INET_ATON('{$_SERVER['REMOTE_ADDR']}') WHERE user_id = $user_id"
;
15. 고정 길이 의 시계 가 더 빠르다
만약 표 의 모든 필드 가 '고정 길이' 라면 전체 표 는 "static" 또는 "fixed - length".예 를 들 어 표 에는 다음 과 같은 유형의 필드 가 없습니다. VARCHAR, TEXT, BLOB.이 필드 중 하 나 를 포함 하면 이 시 계 는 '고정 길이 정적 표' 가 아 닙 니 다. 그러면 MySQL 엔진 은 다른 방법 으로 처리 합 니 다.
고정된 길이 의 시 계 는 성능 을 향상 시 킬 수 있 습 니 다. MySQL 은 더 빨리 찾 을 수 있 기 때 문 입 니 다. 이 고정된 길 이 는 다음 데이터 의 오프셋 을 계산 하기 쉬 우 므 로 자 연 스 럽 게 읽 을 수 있 습 니 다.필드 가 정 해진 길이 가 아니라면 다음 을 찾 으 려 면 프로그램 이 홈 키 를 찾 아야 합 니 다.
또한 고정 길이 의 시계 도 캐 시 와 재 구축 이 용이 하 다.그러나 유일한 부작용 은 고정된 길이 의 필드 가 공간 을 낭비 하 는 것 이다. 왜냐하면 긴 필드 는 네가 사용 하 든 사용 하지 않 든 그 는 그렇게 많은 공간 을 분배 해 야 하기 때문이다.
'수직 분할' 기술 을 사용 하면 시 계 를 두 개 로 나 눌 수 있 고 하 나 는 길이 가 정 해 지지 않 는 다.
다음으로 전송:https://www.cnblogs.com/mafeng/p/6824684.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.