mysql存储过程执行追踪
mysql存储过程执行跟踪 ? ? ? ?学习mysql存储过程执行解析过程,执行一下存储过程 ? ? ? ?create procedure aa() ? ? ? ? ? ?begin ? ? ? ? ? ? ? ? declare x varchar(10); ? ? ? ? ? ? ? ? select count(*) from test where aaa = x ; ? ? ? ? ? ?end ? ? ?
mysql存储过程执行跟踪? ? ? ?学习mysql存储过程执行解析过程,执行一下存储过程
? ? ? ?create procedure aa()
? ? ? ? ? ?begin
? ? ? ? ? ? ? ? declare x varchar(10);
? ? ? ? ? ? ? ? select count(*) from test where aaa = x ;
? ? ? ? ? ?end
? ? ? 在JOIN::exec上设个断点,跟踪一下
? ? ? 执行堆栈如下:
#0 ?JOIN::exec (this=0x900e548) at sql_select.cc:2311
#1 ?0x08268373 in mysql_select (thd=0xb53d2fd0, rref_pointer_array=0x9005984, tables=0x9006040, wild_num=0, fields=@0x9005914, conds=0x90065f8, og_num=0, order=0x0, group=0x0, having=0x0, proc_param=0x0, select_options=2147765760, result=0x900c698, unit=0x90055ec, select_lex=0x9005880) at sql_select.cc:3067
#2 ?0x0826887d in handle_select (thd=0xb53d2fd0, lex=0x9005590, result=0x900c698, setup_tables_done_option=0) at sql_select.cc:310
#3 ?0x081e1af7 in execute_sqlcom_select (thd=0xb53d2fd0, all_tables=0x9006040) at sql_parse.cc:4943
#4 ?0x081e432f in mysql_execute_command (thd=0xb53d2fd0) at sql_parse.cc:2157
#5 ?0x0835c987 in sp_instr_stmt::exec_core (this=0x90066f0, thd=0xb53d2fd0, nextp=0xb54912d0) at sp_head.cc:2927
#6 ?0x0835cbd1 in sp_lex_keeper::reset_lex_and_exec_core (this=0x9006718, thd=0xb53d2fd0, nextp=0xb54912d0, open_tables=false, instr=0x90066f0) at sp_head.cc:2751
#7 ?0x08363962 in sp_instr_stmt::execute (this=0x90066f0, thd=0xb53d2fd0, nextp=0xb54912d0) at sp_head.cc:2864
#8 ?0x08360f89 in sp_head::execute (this=0x9004560, thd=0xb53d2fd0) at sp_head.cc:1248
#9 ?0x08361a53 in sp_head::execute_procedure (this=0x9004560, thd=0xb53d2fd0, args=0xb53d44bc) at sp_head.cc:1989
#10 0x081e966a in mysql_execute_command (thd=0xb53d2fd0) at sql_parse.cc:4401
#11 0x081ebbfa in mysql_parse (thd=0xb53d2fd0, inBuf=0x8fdfa58 "call aa()", length=9, found_semicolon=0xb5491f14) at sql_parse.cc:5958
#12 0x081ecae6 in dispatch_command (command=COM_QUERY, thd=0xb53d2fd0, packet=0xb53f35c9 "call aa()", packet_length=9) at sql_parse.cc:1049
#13 0x081eddaa in do_command (thd=0xb53d2fd0) at sql_parse.cc:731
#14 0x081dd5a7 in handle_one_connection (arg=0xb53d2fd0) at sql_connect.cc:1146
#15 0x4dfe92db in start_thread (arg=0xb5492790) at pthread_create.c:296
#16 0x006cf14e in clone () from /lib/libc.so.
? ? 具体代码
? ? 在sql_parse.cc中
? ? ?case SQLCOM_CALL:
? ? ? ? ....
? ? ? ? sp= sp_find_routine(thd, TYPE_ENUM_PROCEDURE, lex->spname,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? &thd->sp_proc_cache, TRUE)) -------此处对存储过程进行解析
? ? ? ? ?....
? ? ? ? ?res= sp->execute_procedure(thd, &lex->value_list); -------执行存储过程
? ? }
?
? ? bool?sp_head::execute_procedure(THD *thd, List
? ? ?....
? ? ?//前面对参数进行一些处理
? ? ? ?if (!err_status)
? ? ? ? ? ? ? ? ? ? ? ?err_status= execute(thd);//具体执行存储过程
? ? ? ? ? ? ? ...对出参进行处理
? ? }
? ??
? ?bool ??sp_head::execute(THD *thd){
?...
?
do
? ? ? ? {
? ? ? ? ? ? ? sp_instr *i;
? ? ? ? ? ? ? uint hip;
? ? ? ? ? ? ? i = get_instr(ip);// Returns NULL when we're done.
? ? ? ? ? ? ? err_status= i->execute(thd, &ip); //执行存储过程中的每一个语句,每个具体语句都解析为sp_instr的子类
? ? ? ?}while (!err_status && !thd->killed && !thd->is_fatal_error);
? ? ? ?//上面循环其实就是一个sql的执行引擎,不断读入执行,直到结束
? }
? ?
? ? ?int?sp_instr_stmt::exec_core(THD *thd, uint *nextp)
? ? {
?MYSQL_QUERY_EXEC_START(thd->query,
? ? ? ? ? ? ? ? ? ? ? ? ?thd->thread_id,
? ? ? ? ? ? ? ? ? ? ? ? ?(char *) (thd->db ? thd->db: ""),
? ? ? ? ? ? ? ? ? ? ? ? ?thd->security_ctx->priv_user,
? ? ? ? ? ? ? ? ? ? ? ? ?(char *) thd->security_ctx->host_or_ip,
? ? ? ? ? ? ? ? ? ? ? ? ?3);
? ? ? ? ? int res= mysql_execute_command(thd); //对每一个sql进行执行。这里就和普通的sql是一样了
? ? ? ? ? MYSQL_QUERY_EXEC_DONE(res);
? ? ? ? ? *nextp= m_ip+1; //将上面ip推进到下一条语句,让上面的循环执行下一个语句
? ? ? ? ? ?return res;
? ?}
?
看一下解析器解析的中where?
?
where aaa = x?
|
|--> where Item_func_eq ?-----表示这是个等于条件操作
? ? ? ? ? ?| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/ Item_field ----代表字段aaa
? ? ? ? ? ?|-----> Item** args -----|
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \ Item_sp_local--代表变量x
解析在sql_yacc.yy中
simple_ident:
? ? ? ? ? ident
? ? ? ? ? {
? ? ? ? ? ? THD *thd= YYTHD;
? ? ? ? ? ? LEX *lex= thd->lex;
? ? ? ? ? ? Lex_input_stream *lip= YYLIP;
? ? ? ? ? ? sp_variable_t *spv;
? ? ? ? ? ? sp_pcontext *spc = lex->spcont;
? ? ? ? ? ? if (spc && (spv = spc->find_variable(&$1))) //判断语句中是否有变量
? ? ? ? ? ? {
? ? ? ? ? ? ? /* We're compiling a stored procedure and found a variable */
? ? ? ? ? ? ? if (! lex->parsing_options.allows_variable)
? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? my_error(ER_VIEW_SELECT_VARIABLE, MYF(0));
? ? ? ? ? ? ? ? MYSQL_YYABORT;
? ? ? ? ? ? ? }
?
? ? ? ? ? ? ? Item_splocal *splocal;
? ? ? ? ? ? ? splocal= new (thd->mem_root)
? ? ? ? ? ? ? ? ? ? ? ? ?Item_splocal($1,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? spv->offset, spv->type,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? lip->get_tok_start_prev() - lex->sphead->m_tmp_query,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? lip->get_tok_end() - lip->get_tok_start_prev());
? ? ? ? ? ? ? if (splocal == NULL)
? ? ? ? ? ? ? ? MYSQL_YYABORT;
#ifndef DBUG_OFF
? ? ? ? ? ? ? splocal->m_sp= lex->sphead;
#endif
? ? ? ? ? ? ? $$= splocal;
? ? ? ? ? ? ? lex->safe_to_cache_query=0;
? ? ? ? ? ? }
? ? ? ? ? ? else
? ? ? ? ? ? {
? ? ? ? ? ? ? SELECT_LEX *sel= Select;
? ? ? ? ? ? ? if ((sel->parsing_place != IN_HAVING) ||
? ? ? ? ? ? ? ? ? (sel->get_in_sum_expr() > 0))
? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? $$= new (thd->mem_root) Item_field(Lex->current_context(),
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?NullS, NullS, $1.str);
? ? ? ? ? ? ? }
? ? ? ? ? ? ? else
? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? $$= new (thd->mem_root) Item_ref(Lex->current_context(),
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?NullS, NullS, $1.str);
? ? ? ? ? ? ? }
? ? ? ? ? ? ? if ($$ == NULL)
? ? ? ? ? ? ? ? MYSQL_YYABORT;
? ? ? ? ? ? }
? ? ? ? ? }
? ? ? ? | simple_ident_q { $$= $1; }
? ? ? ? ;
?
?

핫 AI 도구

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

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

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

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

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

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

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











MySQL 데이터베이스에서 사용자와 데이터베이스 간의 관계는 권한과 테이블로 정의됩니다. 사용자는 데이터베이스에 액세스 할 수있는 사용자 이름과 비밀번호가 있습니다. 권한은 보조금 명령을 통해 부여되며 테이블은 Create Table 명령에 의해 생성됩니다. 사용자와 데이터베이스 간의 관계를 설정하려면 데이터베이스를 작성하고 사용자를 생성 한 다음 권한을 부여해야합니다.

데이터 통합 단순화 : AmazonRdsMysQL 및 Redshift의 Zero ETL 통합 효율적인 데이터 통합은 데이터 중심 구성의 핵심입니다. 전통적인 ETL (추출, 변환,로드) 프로세스는 특히 데이터베이스 (예 : AmazonRDSMySQL)를 데이터웨어 하우스 (예 : Redshift)와 통합 할 때 복잡하고 시간이 많이 걸립니다. 그러나 AWS는 이러한 상황을 완전히 변경 한 Zero ETL 통합 솔루션을 제공하여 RDSMYSQL에서 Redshift로 데이터 마이그레이션을위한 단순화 된 거의 실시간 솔루션을 제공합니다. 이 기사는 RDSMYSQL ZERL ETL 통합으로 Redshift와 함께 작동하여 데이터 엔지니어 및 개발자에게 제공하는 장점과 장점을 설명합니다.

MySQL에는 무료 커뮤니티 버전과 유료 엔터프라이즈 버전이 있습니다. 커뮤니티 버전은 무료로 사용 및 수정할 수 있지만 지원은 제한되어 있으며 안정성이 낮은 응용 프로그램에 적합하며 기술 기능이 강합니다. Enterprise Edition은 안정적이고 신뢰할 수있는 고성능 데이터베이스가 필요하고 지원 비용을 기꺼이 지불하는 응용 프로그램에 대한 포괄적 인 상업적 지원을 제공합니다. 버전을 선택할 때 고려 된 요소에는 응용 프로그램 중요도, 예산 책정 및 기술 기술이 포함됩니다. 완벽한 옵션은없고 가장 적합한 옵션 만 있으므로 특정 상황에 따라 신중하게 선택해야합니다.

1. 올바른 색인을 사용하여 스캔 한 데이터의 양을 줄임으로써 데이터 검색 속도를 높이십시오. 테이블 열을 여러 번 찾으면 해당 열에 대한 인덱스를 만듭니다. 귀하 또는 귀하의 앱이 기준에 따라 여러 열에서 데이터가 필요한 경우 복합 인덱스 2를 만듭니다. 2. 선택을 피하십시오 * 필요한 열만 선택하면 모든 원치 않는 열을 선택하면 더 많은 서버 메모리를 선택하면 서버가 높은 부하 또는 주파수 시간으로 서버가 속도가 느려지며, 예를 들어 Creation_at 및 Updated_at 및 Timestamps와 같은 열이 포함되어 있지 않기 때문에 쿼리가 필요하지 않기 때문에 테이블은 선택을 피할 수 없습니다.

MySQL 데이터베이스 성능 최적화 안내서 리소스 집약적 응용 프로그램에서 MySQL 데이터베이스는 중요한 역할을 수행하며 대규모 트랜잭션 관리를 담당합니다. 그러나 응용 프로그램 규모가 확장됨에 따라 데이터베이스 성능 병목 현상은 종종 제약이됩니다. 이 기사는 일련의 효과적인 MySQL 성능 최적화 전략을 탐색하여 응용 프로그램이 고 부하에서 효율적이고 반응이 유지되도록합니다. 실제 사례를 결합하여 인덱싱, 쿼리 최적화, 데이터베이스 설계 및 캐싱과 같은 심층적 인 주요 기술을 설명합니다. 1. 데이터베이스 아키텍처 설계 및 최적화 된 데이터베이스 아키텍처는 MySQL 성능 최적화의 초석입니다. 몇 가지 핵심 원칙은 다음과 같습니다. 올바른 데이터 유형을 선택하고 요구 사항을 충족하는 가장 작은 데이터 유형을 선택하면 저장 공간을 절약 할 수있을뿐만 아니라 데이터 처리 속도를 향상시킬 수 있습니다.

데이터베이스 산 속성에 대한 자세한 설명 산 속성은 데이터베이스 트랜잭션의 신뢰성과 일관성을 보장하기위한 일련의 규칙입니다. 데이터베이스 시스템이 트랜잭션을 처리하는 방법을 정의하고 시스템 충돌, 전원 중단 또는 여러 사용자의 동시 액세스가 발생할 경우에도 데이터 무결성 및 정확성을 보장합니다. 산 속성 개요 원자력 : 트랜잭션은 불가분의 단위로 간주됩니다. 모든 부분이 실패하고 전체 트랜잭션이 롤백되며 데이터베이스는 변경 사항을 유지하지 않습니다. 예를 들어, 은행 송금이 한 계정에서 공제되지만 다른 계정으로 인상되지 않은 경우 전체 작업이 취소됩니다. BeginTransaction; updateAccountssetBalance = Balance-100WH

MySQL 사용자 이름 및 비밀번호를 작성하려면 : 1. 사용자 이름과 비밀번호를 결정합니다. 2. 데이터베이스에 연결; 3. 사용자 이름과 비밀번호를 사용하여 쿼리 및 명령을 실행하십시오.

MySQL은 설치가 간단하고 강력하며 데이터를 쉽게 관리하기 쉽기 때문에 초보자에게 적합합니다. 1. 다양한 운영 체제에 적합한 간단한 설치 및 구성. 2. 데이터베이스 및 테이블 작성, 삽입, 쿼리, 업데이트 및 삭제와 같은 기본 작업을 지원합니다. 3. 조인 작업 및 하위 쿼리와 같은 고급 기능을 제공합니다. 4. 인덱싱, 쿼리 최적화 및 테이블 파티셔닝을 통해 성능을 향상시킬 수 있습니다. 5. 데이터 보안 및 일관성을 보장하기위한 지원 백업, 복구 및 보안 조치.
