MySQL 优化(十)
7.5.4 编译和连接如何影响MySQL的速度 以下的大部分测试都是在Linux上用MySQL的基准套件来做的,不过它们对其他操作系统以及不同的工作量也是有一定启示的。 用 -static 连接的话,MySQL执行速度的速度是最快的。 在Linux上,用 pgcc 和 -O3 编译的代码最快
7.5.4
编译和连接如何影响MySQL的速度
以下的大部分测试都是在Linux上用MySQL的基准套件来做的,不过它们对其他操作系统以及不同的工作量也是有一定启示的。
用
-static
连接的话,MySQL执行速度的速度是最快的。
在Linux上,用 pgcc
和 -O3
编译的代码最快。大概需要200MB的内存加上这些选项来编译 `sql_yacc.cc`,因为 gcc/pgcc
需要大量内存来编译所有的内部函数。想要配置MySQL以避免包含 libstdc++
库就要加上 CXX=gcc
参数,不过这不是必须的。注意,使用某些版本的 pgcc<br>
编译的结果代码只能在奔腾处理器上运行,尽管已经给编译器增加选项想让结果代码可以在所有的x586类型(如AMD)处理器上运行。
如果使用比较好的编译器以及编译选项,应用程序大概能提高10-30%的速度。这在自己编译MySQL服务器的时候尤为重要。
我们已经测试
Cygnus CodeFusion 和 Fujitsu
编译器了,不过测试它们时,无论哪个都没有完全地解决bug以允许最佳方式编译MySQL。
标准的MySQL二进制发布包已经编译支持所有的字符集了。如果想要自己编译MySQL,只需编译支持想要使用的字符集。可以在
configure
时增加 --with-charset
选项来控制。
以下是我们已经做过的一些测量:
- 如果使用
pgcc
编译任何东西时用
-O6
选项,则mysqld
服务器会比用gcc
2.95.2
编译快1%。 - 如果使用动态连接(没用
-static
),则在Linux上结果会慢13%。注意,这仍然可以让你的应用程序客户端动态连接MySQL的库。这对提高服务器性能相当关键。 - 如果做
strip mysqld
了,则结果会快4%。 - 在同一个主机上连接到服务器,如果使用TCP/IP而不是Unix套接字文件,那么会慢7.5%(在Unix上,如果使用主机名
localhost
连接,MySQL默认使用套接字文件)。 - 用TCP/IP连接时,直接连接本机服务器比连接不同主机上的服务器会慢8-11%,尽管是通过100Mb/s的以太网。
- 运行基准测试时如果采用安全连接(所有的数据都用内部支持的SSL加密)则会比用不加密链接慢55%。
- 编译时增加
--with-debug=full
选项,则大部分查询都会慢20%。一些查询可能会变得很慢;例如,MySQL的基准套件可能会慢35%。如果只增加选项
--with-debug
(没有
=full
),则只会慢15%。一个使用--with-debug=full
选项编译后的
mysqld
可以在启动时增加--skip-safemalloc
选项来禁用运行时内存检查。则执行速度就会接近于增加
--with-debug
参数时的情况。 - 在 Sun UltraSPARC-IIe 上,用 Forte 5.0 编译的服务器会比用
gcc
3.2 编译的快4%。 - 在 Sun UltraSPARC-IIe 上,用 Forte 5.0
编译的服务器在32位平台上比在64位平台上快4%。 - 在 UltraSPARC 上用
gcc
2.95.2 编译,增加-mcpu=v8 -Wa,-xarch=v8plusa
选项的话会快4%。 - 在 Solaris 2.5.1 上,MIT-pthreads 比 Solaris
原始的单处理器线程慢8-12%。在不同的负载或者CPU下,这个差异会更大。
- 在 Linux x86上用
gcc
编译,不增加
帧指针(-fomit-frame-pointer
或-fomit-frame-pointer -ffixed-ebp
)选项
的话会慢1-4%。
MySQL AB提供的Linux上的MySQL二进制发布包通常用 pgcc
编译。不过我们又重新使用
gcc
来编译了,因为用 pgcc
编译的代码不能在AMD上运行。我们会一直使用 gcc
来编译直到
pgcc
的这个bug解决了。与此同时,如果你有非AMD机器,就可以用 pgcc
来编译以使MySQL更快。标准的MySQL
Linux二进制包是静态连接的,这使得它更快且移植性更好。
href="javascript:void(0);">7.5.5 MySQL 如何使用内存
以下展示了 mysqld
服务器使用内存的几种方法。可适用的是,和使用内存相关的系统变量名已经给出了:
- 索引缓冲(
key_buffer_size
变量)在所有的线程间是共享的;服务器所需的其他缓冲已经分配好了。详情请看"
href="/?q=node/48#Server_parameters">7.5.2 Tuning Server
Parameters"。
- 每个连接使用的一些线程特有的空间:
- 一个堆栈(默认是64KB,
thread_stack
变量)。 - 一个连接缓冲(
net_buffer_length
变量)。
- 一个结果缓冲(
net_buffer_length
变量)。
连接缓冲和结果缓冲可根据需要动态扩大到
max_allowed_packet
。一个查询正在执行时,当前查询语句的一份拷贝也需要为之分配内存。 - 一个堆栈(默认是64KB,
- 所有的线程共享一样的基本内存。
- 只有压缩后的
ISAM
和MyISAM
表才是内存映射的。这是因为32位的内存只有4GB的内存空间,对大部分大表都不够。当64位寻址的操作系统更普遍时,我们会普遍支持内存映射的。 - 每个需要顺序扫描数据表的请求都需要分配一个读缓冲(
read_buffer_size
变量)。 - 如果以"随机"顺序读取记录(例如,排序之后),一个随机-读缓冲就必须分配以避免磁盘搜索(
read_rnd_buffer_size
变量)。 - 所有的表连接都在一个步骤中完成,甚至大部分连接可以不使用临时表就能完成。大部分临时表都是基于内存(
HEAP
表)的。记录长度很长(所有的字段长度之和)或者包含有BLOB
字段的临时表都会存储在磁盘中。在MySQL
3.23.2之前有一个问题是,当一个内部的内存表大小超过tmp_table_size
后,就会产生一个The<br> table<br> <var>tbl_name</var> is full
错误。在MySQL 3.23.2后,这会自动处理,在必须的时候把内存表转换成基于磁盘存储的
MyISAM
表。想要在旧版本的MySQL也能正常运行,可以给mysqld
设置tmp_table_size
选项以增加临时表大小,或者在客户端程序中设置SQL_BIG_TABLES
选项。详情请看"
href="/?q=node/13#SET_OPTION">14.5.3.1SET
Syntax"。在MySQL
3.20中,临时表的大小最多为
record_buffer*16
;如果你使用这个版本,就必须加大
record_buffer
的值。可以在使用
--big-tables
选项启动mysqld
来允许将临时表保存在磁盘中。不过这会影响很多查询编译。 - 大部分需要做排序的请求都会分配排序缓冲,且视结果集大小分配0到2个临时文件。详情请看"
href="javascript:void(0);">A.4.4 Where MySQL Stores Temporary
Files"。 - 几乎所有的解析和计算在本地内存存储中已经做完了。无需为小的条目耗费内存,因此通常能避免比较慢的内存分配以及释放。内存只分配给不可预料的大字符串;这由
malloc()
和free()
来完成。 - 每个打开着的
MyISAM
和ISAM
表,索引文件只打开一次,而数据文件则是每次为同时运行的线程打开一次。在每个当前的线程中,表结构,每个字段的结构,需要分配大小
3 * <var>N</var>
的缓冲(N 是记录的最大长度,不计算BLOB
字段)。BLOB
字段需要比BLOB
数据长度多出来5到8字节。MyISAM
和ISAM
存储引擎维护一个额外的缓冲字段供内部使用。 - 对于每个有
BLOB
字段的表,专门为其扩展一个动态缓冲来读取大
BLOB
数据。读表的时候,就会分配一个以最大长的BLOB
数据长度的缓冲。
- 所有的使用中的表句柄都缓存起来并且被当作FIFO来管理。默认地,这个缓存有64个表目。如果有一个表同时被两个运行着的线程使用了,那么在缓存中包含了该表的2个表目。详情请看"
href="/?q=node/47#Table_cache">7.4.8 How MySQL Opens and Closes Tables"。
-
FLUSH TABLES
语句或
mysqladmin flush-tables
命令会关闭所有非使用中的表,并且也会在线程结束后关闭那些使用中的表。这对释放使用中的内存很有效。
ps
和其他系统程序都可以报告 mysqld
使用了大量内存。这个可能是因为在不同内存地址上的线程堆栈导致。例如,Solaris下的
ps
会把堆栈中未使用的内存也认为是已使用了。可以通过 swap -s
命令来检查可用的交换内存。我们已经用好几个内存泄漏监测器来测试了
mysqld
(包括商业的和开源的),应该不会存在内存泄漏。
7.5.6
MySQL 如何使用 DNS
当一个新的客户端连接到 mysqld
时,它就会产生一个新的线程来处理。这个线程首先检查客户主机名是否在主机缓存中。如果没有,它就尝试解析这个主机名:
- 如果操作系统支持线程安全的
gethostbyaddr_r()
和gethostbyname_r()
调用,就用他们来解析。
- 如果操作系统不支持上述两个的线程安全调用,那么线程就县锁定一个mutex,然后再调用它们。这时,其他线程便无法解析不在主机缓存中主机名,直到第一个线程释放了mutex锁。
在
mysqld
启动时使用 --skip-name-resolve
选项就能禁用DNS解析。不过,这样的话就不能在MySQL的授权表中使用主机名了而只能用ip格式。
如果DNS解析很慢且有很多主机,那么可以用
--skip-name-resolve
选项禁用DNS解析或者重新编译 mysqld
时增加 HOST_CACHE_SIZE
的定义值(默认是 128)来提高性能。
启动服务器时使用 --skip-name-resolve
选项就能禁用主机缓存。想要清除主机缓存,可以提交 FLUSH HOSTS
语句或者运行 mysqladmin flush-hosts
命令。
想要彻底禁用TCP/IP连接,在启动服务器时使用 --skip-networking
选项即可。
CONTENT="编译和连接如何影响MySQL的速度,mysql 如何使用内存,mysql 如何使用dns">
CONTENT="编译和连接如何影响MySQL的速度,mysql 如何使用内存,mysql 如何使用dns">
‹ MySQL 优化(九)向上MySQL 优化(十一) ›

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

Navicat 자체는 데이터베이스 비밀번호를 저장하지 않으며 암호화 된 암호 만 검색 할 수 있습니다. 솔루션 : 1. 비밀번호 관리자를 확인하십시오. 2. Navicat의 "비밀번호 기억"기능을 확인하십시오. 3. 데이터베이스 비밀번호를 재설정합니다. 4. 데이터베이스 관리자에게 문의하십시오.

Navicat Premium을 사용하여 데이터베이스 생성 : 데이터베이스 서버에 연결하고 연결 매개 변수를 입력하십시오. 서버를 마우스 오른쪽 버튼으로 클릭하고 데이터베이스 생성을 선택하십시오. 새 데이터베이스의 이름과 지정된 문자 세트 및 Collation의 이름을 입력하십시오. 새 데이터베이스에 연결하고 객체 브라우저에서 테이블을 만듭니다. 테이블을 마우스 오른쪽 버튼으로 클릭하고 데이터 삽입을 선택하여 데이터를 삽입하십시오.

MySQL은 오픈 소스 관계형 데이터베이스 관리 시스템입니다. 1) 데이터베이스 및 테이블 작성 : CreateAbase 및 CreateTable 명령을 사용하십시오. 2) 기본 작업 : 삽입, 업데이트, 삭제 및 선택. 3) 고급 운영 : 가입, 하위 쿼리 및 거래 처리. 4) 디버깅 기술 : 확인, 데이터 유형 및 권한을 확인하십시오. 5) 최적화 제안 : 인덱스 사용, 선택을 피하고 거래를 사용하십시오.

MySQL 및 SQL은 개발자에게 필수적인 기술입니다. 1.MySQL은 오픈 소스 관계형 데이터베이스 관리 시스템이며 SQL은 데이터베이스를 관리하고 작동하는 데 사용되는 표준 언어입니다. 2.MYSQL은 효율적인 데이터 저장 및 검색 기능을 통해 여러 스토리지 엔진을 지원하며 SQL은 간단한 문을 통해 복잡한 데이터 작업을 완료합니다. 3. 사용의 예에는 기본 쿼리 및 조건 별 필터링 및 정렬과 같은 고급 쿼리가 포함됩니다. 4. 일반적인 오류에는 구문 오류 및 성능 문제가 포함되며 SQL 문을 확인하고 설명 명령을 사용하여 최적화 할 수 있습니다. 5. 성능 최적화 기술에는 인덱스 사용, 전체 테이블 스캔 피하기, 조인 작업 최적화 및 코드 가독성 향상이 포함됩니다.

응용 프로그램을 열고 새로운 연결 (Ctrl n)을 선택하여 Navicat에서 새로운 MySQL 연결을 만들 수 있습니다. "MySQL"을 연결 유형으로 선택하십시오. 호스트 이름/IP 주소, 포트, 사용자 이름 및 비밀번호를 입력하십시오. (선택 사항) 고급 옵션을 구성합니다. 연결을 저장하고 연결 이름을 입력하십시오.

다음 단계를 통해 phpmyadmin을 열 수 있습니다. 1. 웹 사이트 제어판에 로그인; 2. phpmyadmin 아이콘을 찾고 클릭하십시오. 3. MySQL 자격 증명을 입력하십시오. 4. "로그인"을 클릭하십시오.

Navicat에서 SQL을 수행하는 단계 : 데이터베이스에 연결하십시오. SQL 편집기 창을 만듭니다. SQL 쿼리 또는 스크립트를 작성하십시오. 실행 버튼을 클릭하여 쿼리 또는 스크립트를 실행하십시오. 결과를 봅니다 (쿼리가 실행 된 경우).
