Mysql 성능 최적화 20 원칙 (3)

원본 링크:http://www.cnblogs.com/mafeng/p/6824684.html
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

좋은 웹페이지 즐겨찾기