在oracle中可以指定的表连接的hint有很多:ordered hint 指示oracle按照from关键字后的表顺序来进行连接;leading hint 指示查询优化器使用指定的表作为连接的首表,即驱动表;use_nl hint指示查询优化器使用nested loops方式连接指定表和其他行源,并且将强制指定表作为inner表。
在mysql中就有之对应的straight_join,由于mysql只支持nested loops的连接方式,所以这里的straight_join类似oracle中的use_nl hint。mysql优化器在处理多表的关联的时候,很有可能会选择错误的驱动表进行关联,导致了关联次数的增加,从而使得sql语句执行变得非常的缓慢,这个时候需要有经验的DBA进行判断,选择正确的驱动表,这个时候straight_join就起了作用了,下面我们来看一看使用straight_join进行优化的案例:
1.用户实例:spxxxxxx的一条sql执行非常的缓慢,sql如下:
73871 | root | 127.0.0.1:49665 | user_app_test | Query | 500 | Sorting result | SELECT DATE(practicetime) date_time,COUNT(DISTINCT a.userid) people_rows FROM test_log a,USER b WHERE a.userid=b.userid AND b.isfree=0 AND LENGTH(b.username)>4 GROUP BY DATE(practicetime)
2.查看执行计划:
mysql> explain SELECT DATE(practicetime) date_time,COUNT(DISTINCT a.userid) people_rows FROM test_log a,USER b WHERE a.userid=b.userid AND b.isfree=0 AND LENGTH(b.username)>4 GROUP BY DATE(practicetime); mysql> explain SELECT DATE(practicetime) date_time,COUNT(DISTINCT a.userid) people_rows -> FROM test_log a,USER b -> WHERE a.userid=b.userid AND b.isfree=0 AND LENGTH(b.username)>4 -> GROUP BY DATE(practicetime)\G; *************************** 1. row *************************** id: 1 select_type: SIMPLE table: a type: ALL possible_keys: ix_test_log_userid key: NULL key_len: NULL ref: NULL rows: 416782 Extra: Using filesort *************************** 2. row *************************** id: 1 select_type: SIMPLE table: b type: eq_ref possible_keys: PRIMARY key: PRIMARY key_len: 96 ref: user_app_testnew.a.userid rows: 1 Extra: Using where 2 rows in set (0.00 sec)
3.查看索引:
mysql> show index from test_log; +————–+————+————————-+————–+————-+———–+————-+———-++ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | +————–+————+————————-+————–+————-+———–+————-+———-++ | test_log | 0 | ix_test_log_unique_ | 1 | unitid | A | 20 | NULL | NULL | | BTREE | | | test_log | 0 | ix_test_log_unique_ | 2 | paperid | A | 20 | NULL | NULL | | BTREE | | | test_log | 0 | ix_test_log_unique_ | 3 | qtid | A | 20 | NULL | NULL | | BTREE | | | test_log | 0 | ix_test_log_unique_ | 4 | userid | A | 400670 | NULL | NULL | | BTREE | | | test_log | 0 | ix_test_log_unique_ | 5 | serial | A | 400670 | NULL | NULL | | BTREE | | | test_log | 1 | ix_test_log_unit | 1 | unitid | A | 519 | NULL | NULL | | BTREE | | | test_log | 1 | ix_test_log_unit | 2 | paperid | A | 2023 | NULL | NULL | | BTREE | | | test_log | 1 | ix_test_log_unit | 3 | qtid | A | 16694 | NULL | NULL | | BTREE | | | test_log | 1 | ix_test_log_serial | 1 | serial | A | 133556 | NULL | NULL | | BTREE | | | test_log | 1 | ix_test_log_userid | 1 | userid | A | 5892 | NULL | NULL | | BTREE | | +————–+————+————————-+————–+————-+———–+————-+———-+——–+——+——-+
4.调整索引,A表优化采用覆盖索引:
mysql>alter table test_log drop index ix_test_log_userid,add index ix_test_log_userid(userid,practicetime)
5.查看执行计划:
mysql> explain SELECT DATE(practicetime) date_time,COUNT(DISTINCT a.userid) people_rows FROM test_log a,USER b WHERE a.userid=b.userid AND b.isfree=0 AND LENGTH(b.username)>4 GROUP BY DATE(practicetime)\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: a type: index possible_keys: ix_test_log_userid key: ix_test_log_userid key_len: 105 ref: NULL rows: 388451 Extra: Using index; Using filesort *************************** 2. row *************************** id: 1 select_type: SIMPLE table: b type: eq_ref possible_keys: PRIMARY key: PRIMARY key_len: 96 ref: user_app_test.a.userid rows: 1 Extra: Using where 2 rows in set (0.00 sec)
调整后执行稍有效果,但是还不明显,还没有找到要害:
SELECT DATE(practicetime) date_time,COUNT(DISTINCT a.userid) people_rows FROM test_log a,USER b WHERE a.userid=b.userid AND b.isfree=0 AND LENGTH(b.username)>4 GROUP BY DATE(practicetime); ………………. 143 rows in set (1 min 12.62 sec)
6.执行时间仍然需要很长,时间的消耗主要耗费在Using filesort中,参与排序的数据量有38W之多,所以需要转换驱动表;尝试采用user表做驱动表:使用straight_join强制连接顺序:
mysql> explain SELECT DATE(practicetime) date_time,COUNT(DISTINCT a.userid) people_rows FROM USER b straight_join test_log a WHERE a.userid=b.userid AND b.isfree=0 AND LENGTH(b.username)>4 GROUP BY DATE(practicetime)\G; *************************** 1. row *************************** id: 1 select_type: SIMPLE table: b type: ALL possible_keys: PRIMARY key: NULL key_len: NULL ref: NULL rows: 42806 Extra: Using where; Using temporary; Using filesort *************************** 2. row *************************** id: 1 select_type: SIMPLE table: a type: ref possible_keys: ix_test_log_userid key: ix_test_log_userid key_len: 96 ref: user_app_test.b.userid rows: 38 Extra: Using index 2 rows in set (0.00 sec)
执行时间已经有了质的变化,降低到了2.56秒;
mysql>SELECT DATE(practicetime) date_time,COUNT(DISTINCT a.userid) people_rows FROM USER b straight_join test_log a WHERE a.userid=b.userid AND b.isfree=0 AND LENGTH(b.username)>4 GROUP BY DATE(practicetime); …….. 143 rows in set (2.56 sec)
7.在分析执行计划的第一步:Using where; Using temporary; Using filesort,user表其实也可以采用覆盖索引来避免using where的出现,所以继续调整索引:
mysql> show index from user; +——-+————+——————+————–+————-+———–+————-+———-+——–+——+————+———+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | +——-+————+——————+————–+————-+———–+————-+———-+——–+——+————+———+ | user | 0 | PRIMARY | 1 | userid | A | 43412 | NULL | NULL | | BTREE | | | user | 0 | ix_user_email | 1 | email | A | 43412 | NULL | NULL | | BTREE | | | user | 1 | ix_user_username | 1 | username | A | 202 | NULL | NULL | | BTREE | | +——-+————+——————+————–+————-+———–+————-+———-+——–+——+————+———+ 3 rows in set (0.01 sec) mysql>alter table user drop index ix_user_username,add index ix_user_username(username,isfree); Query OK, 42722 rows affected (0.73 sec) Records: 42722 Duplicates: 0 Warnings: 0 mysql>explain SELECT DATE(practicetime) date_time,COUNT(DISTINCT a.userid) people_rows FROM USER b straight_join test_log a WHERE a.userid=b.userid AND b.isfree=0 AND LENGTH(b.username)>4 GROUP BY DATE(practicetime); *************************** 1. row *************************** id: 1 select_type: SIMPLE table: b type: index possible_keys: PRIMARY key: ix_user_username key_len: 125 ref: NULL rows: 42466 Extra: Using where; Using index; Using temporary; Using filesort *************************** 2. row *************************** id: 1 select_type: SIMPLE table: a type: ref possible_keys: ix_test_log_userid key: ix_test_log_userid key_len: 96 ref: user_app_test.b.userid rows: 38 Extra: Using index 2 rows in set (0.00 sec)
8.执行时间降低到了1.43秒:
mysql>SELECT DATE(practicetime) date_time,COUNT(DISTINCT a.userid) people_rows FROM USER b straight_join test_log a WHERE a.userid=b.userid AND b.isfree=0 AND LENGTH(b.username)>4 GROUP BY DATE(practicetime); 。。。。。。。 143 rows in set (1.43 sec)

innodbbufferpool은 데이터와 인덱싱 페이지를 캐싱하여 디스크 I/O를 줄여 데이터베이스 성능을 향상시킵니다. 작업 원칙에는 다음이 포함됩니다. 1. 데이터 읽기 : BufferPool의 데이터 읽기; 2. 데이터 작성 : 데이터 수정 후 BufferPool에 쓰고 정기적으로 디스크로 새로 고치십시오. 3. 캐시 관리 : LRU 알고리즘을 사용하여 캐시 페이지를 관리합니다. 4. 읽기 메커니즘 : 인접한 데이터 페이지를 미리로드합니다. Bufferpool을 크기를 조정하고 여러 인스턴스를 사용하여 데이터베이스 성능을 최적화 할 수 있습니다.

다른 프로그래밍 언어와 비교할 때 MySQL은 주로 데이터를 저장하고 관리하는 데 사용되는 반면 Python, Java 및 C와 같은 다른 언어는 논리적 처리 및 응용 프로그램 개발에 사용됩니다. MySQL은 데이터 관리 요구에 적합한 고성능, 확장 성 및 크로스 플랫폼 지원으로 유명하며 다른 언어는 데이터 분석, 엔터프라이즈 애플리케이션 및 시스템 프로그래밍과 같은 해당 분야에서 이점이 있습니다.

MySQL은 데이터 저장, 관리 및 분석에 적합한 강력한 오픈 소스 데이터베이스 관리 시스템이기 때문에 학습 할 가치가 있습니다. 1) MySQL은 SQL을 사용하여 데이터를 작동하고 구조화 된 데이터 관리에 적합한 관계형 데이터베이스입니다. 2) SQL 언어는 MySQL과 상호 작용하는 열쇠이며 CRUD 작업을 지원합니다. 3) MySQL의 작동 원리에는 클라이언트/서버 아키텍처, 스토리지 엔진 및 쿼리 최적화가 포함됩니다. 4) 기본 사용에는 데이터베이스 및 테이블 작성이 포함되며 고급 사용량은 Join을 사용하여 테이블을 결합하는 것과 관련이 있습니다. 5) 일반적인 오류에는 구문 오류 및 권한 문제가 포함되며 디버깅 기술에는 구문 확인 및 설명 명령 사용이 포함됩니다. 6) 성능 최적화에는 인덱스 사용, SQL 문의 최적화 및 데이터베이스의 정기 유지 보수가 포함됩니다.

MySQL은 초보자가 데이터베이스 기술을 배우는 데 적합합니다. 1. MySQL 서버 및 클라이언트 도구를 설치하십시오. 2. SELECT와 같은 기본 SQL 쿼리를 이해하십시오. 3. 마스터 데이터 작업 : 데이터를 만들고, 삽입, 업데이트 및 삭제합니다. 4. 고급 기술 배우기 : 하위 쿼리 및 창 함수. 5. 디버깅 및 최적화 : 구문 확인, 인덱스 사용, 선택*을 피하고 제한을 사용하십시오.

MySQL은 테이블 구조 및 SQL 쿼리를 통해 구조화 된 데이터를 효율적으로 관리하고 외래 키를 통해 테이블 간 관계를 구현합니다. 1. 테이블을 만들 때 데이터 형식을 정의하고 입력하십시오. 2. 외래 키를 사용하여 테이블 간의 관계를 설정하십시오. 3. 인덱싱 및 쿼리 최적화를 통해 성능을 향상시킵니다. 4. 데이터 보안 및 성능 최적화를 보장하기 위해 데이터베이스를 정기적으로 백업 및 모니터링합니다.

MySQL은 웹 개발에 널리 사용되는 오픈 소스 관계형 데이터베이스 관리 시스템입니다. 주요 기능에는 다음이 포함됩니다. 1. 다른 시나리오에 적합한 InnoDB 및 MyISAM과 같은 여러 스토리지 엔진을 지원합니다. 2.로드 밸런싱 및 데이터 백업을 용이하게하기 위해 마스터 슬레이브 복제 기능을 제공합니다. 3. 쿼리 최적화 및 색인 사용을 통해 쿼리 효율성을 향상시킵니다.

SQL은 MySQL 데이터베이스와 상호 작용하여 데이터 첨가, 삭제, 수정, 검사 및 데이터베이스 설계를 실현하는 데 사용됩니다. 1) SQL은 Select, Insert, Update, Delete 문을 통해 데이터 작업을 수행합니다. 2) 데이터베이스 설계 및 관리에 대한 생성, 변경, 삭제 문을 사용하십시오. 3) 복잡한 쿼리 및 데이터 분석은 SQL을 통해 구현되어 비즈니스 의사 결정 효율성을 향상시킵니다.

MySQL의 기본 작업에는 데이터베이스, 테이블 작성 및 SQL을 사용하여 데이터에서 CRUD 작업을 수행하는 것이 포함됩니다. 1. 데이터베이스 생성 : createAbasemy_first_db; 2. 테이블 만들기 : CreateTableBooks (idintauto_incrementprimarykey, titlevarchar (100) notnull, authorvarchar (100) notnull, published_yearint); 3. 데이터 삽입 : InsertIntobooks (Title, Author, Published_year) VA


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

MinGW - Windows용 미니멀리스트 GNU
이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

에디트플러스 중국어 크랙 버전
작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경
