mysql性能优化.ppt
MySQL优化l lMySQLMySQL优化方式优化方式l lMySQLMySQL技巧分享技巧分享l lMySQLMySQL函数函数目录索引目录索引MySQLMySQL优化方式优化方式l l系统优化:硬件、架构系统优化:硬件、架构l l服务优化服务优化l l应用优化应用优化MySQL优化方式优化方式l l使用好的硬件,更快的硬盘、大内存、多核使用好的硬件,更快的硬盘、大内存、多核使用好的硬件,更快的硬盘、大内存、多核使用好的硬件,更快的硬盘、大内存、多核CPUCPUCPUCPU,专业的存,专业的存,专业的存,专业的存储服务器(储服务器(储服务器(储服务器(NASNASNASNAS、SANSANSANSAN)l l设计合理架构,如果设计合理架构,如果设计合理架构,如果设计合理架构,如果 MySQL MySQL MySQL MySQL 访问频繁,考虑访问频繁,考虑访问频繁,考虑访问频繁,考虑 Master/Slave Master/Slave Master/Slave Master/Slave 读写分离;数据库分表、数据库切片(分布式),也考虑使读写分离;数据库分表、数据库切片(分布式),也考虑使读写分离;数据库分表、数据库切片(分布式),也考虑使读写分离;数据库分表、数据库切片(分布式),也考虑使用相应缓存服务帮助用相应缓存服务帮助用相应缓存服务帮助用相应缓存服务帮助 MySQL MySQL MySQL MySQL 缓解访问压力缓解访问压力缓解访问压力缓解访问压力系统优化系统优化l l配置合理的配置合理的配置合理的配置合理的MySQLMySQLMySQLMySQL服务器,尽量在应用本身达到一个服务器,尽量在应用本身达到一个服务器,尽量在应用本身达到一个服务器,尽量在应用本身达到一个MySQLMySQLMySQLMySQL最最最最合理的使用合理的使用合理的使用合理的使用l l针对针对针对针对 MyISAM MyISAM MyISAM MyISAM 或或或或 InnoDB InnoDB InnoDB InnoDB 不同引擎进行不同定制性配置不同引擎进行不同定制性配置不同引擎进行不同定制性配置不同引擎进行不同定制性配置l l针对不同的应用情况进行合理配置针对不同的应用情况进行合理配置针对不同的应用情况进行合理配置针对不同的应用情况进行合理配置l l针对针对针对针对 f f f f 进行配置,后面设置是针对内存为进行配置,后面设置是针对内存为进行配置,后面设置是针对内存为进行配置,后面设置是针对内存为2G2G2G2G的服务器的服务器的服务器的服务器进行的合理设置进行的合理设置进行的合理设置进行的合理设置服务优化服务优化MySQLMySQL配置原则配置原则配置原则配置原则 服务优化服务优化公共选项公共选项公共选项公共选项选项缺省值推荐值说明max_connections1001024MySQL服务器同时处理的数据库连接的最大数量query_cache_size0(不打开)16M查询缓存区的最大长度,按照当前需求,一倍一倍增加,本选项比较重要sort_buffer_size512K16M每个线程的排序缓存大小,一般按照内存可以设置为2M以上,推荐是16M,该选项对排序order by,group by起作用record_buffer128K16M每个进行一个顺序扫描的线程为其扫描的每张表分配这个大小的一个缓冲区,可以设置为2M以上table_cache64512为所有线程打开表的数量。增加该值能增加mysqld要求的文件描述符的数量。MySQL对每个唯一打开的表需要2个文件描述符。服务优化服务优化MyISAMMyISAM选项选项选项选项选项缺省值推荐值说明key_buffer_size8M256M用来存放索引区块的缓存值,建议128M以上,不要大于内存的30%read_buffer_size128K16M用来做MyISAM表全表扫描的缓冲大小.为从数据表顺序读取数据的读操作保留的缓存区的长度myisam_sort_buffer_size16M128M设置,恢复,修改表的时候使用的缓冲大小,值不要设的太大服务优化服务优化InnoDBInnoDB选项选项选项选项选项缺省值推荐值说明innodb_buffer_pool_size32M1GInnoDB使用一个缓冲池来保存索引和原始数据,这里你设置越大,你在存取表里面数据时所需要的磁盘I/O越少,一般是内存的一半,不超过2G,否则系统会崩溃,这个参数非常重要innodb_additional_mem_pool_size2M128MInnoDB用来保存 metadata 信息,如果内存是4G,最好本值超过200Minnodb_flush_log_at_trx_commit10 0 代表日志只大约每秒写入日志文件并且日志文件刷新到磁盘;1 为执行完没执行一条SQL马上commit;2 代表日志写入日志文件在每次提交后,但是日志文件只有大约每秒才会刷新到磁盘上.对速度影响比较大,同时也关系数据完整性innodb_log_file_size8M256M在日志组中每个日志文件的大小,一般是innodb_buffer_pool_size的25%,官方推荐是 innodb_buffer_pool_size 的 40-50%,设置大一点来避免在日志文件覆写上不必要的缓冲池刷新行为innodb_log_buffer_size128K8M用来缓冲日志数据的缓冲区的大小.推荐是8M,官方推荐该值小于16M,最好是 1M-8M 之间l l设计合理的数据表结构设计合理的数据表结构设计合理的数据表结构设计合理的数据表结构l l对数据表建立合适有效的数据库索引对数据表建立合适有效的数据库索引对数据表建立合适有效的数据库索引对数据表建立合适有效的数据库索引l l数据查询:编写简洁高效的数据查询:编写简洁高效的数据查询:编写简洁高效的数据查询:编写简洁高效的SQLSQLSQLSQL语句语句语句语句应用优化应用优化应用优化方式应用优化方式应用优化方式应用优化方式 应用优化应用优化表结构设计原则表结构设计原则表结构设计原则表结构设计原则n n 选择合适的数据类型:如果能够定长尽量定长选择合适的数据类型:如果能够定长尽量定长选择合适的数据类型:如果能够定长尽量定长选择合适的数据类型:如果能够定长尽量定长n n使用使用使用使用 ENUMENUM而不是而不是而不是而不是 VARCHAR,ENUMVARCHAR,ENUM类型是非常快和紧凑的,类型是非常快和紧凑的,类型是非常快和紧凑的,类型是非常快和紧凑的,在实际上,其保存的是在实际上,其保存的是在实际上,其保存的是在实际上,其保存的是 TINYINTTINYINT,但其外表上显示为字符串。这样,但其外表上显示为字符串。这样,但其外表上显示为字符串。这样,但其外表上显示为字符串。这样一来,用这个字段来做一些选项列表变得相当的完美一来,用这个字段来做一些选项列表变得相当的完美一来,用这个字段来做一些选项列表变得相当的完美一来,用这个字段来做一些选项列表变得相当的完美。n n 不要使用无法加索引的类型作为关键字段,比如不要使用无法加索引的类型作为关键字段,比如不要使用无法加索引的类型作为关键字段,比如不要使用无法加索引的类型作为关键字段,比如 texttext类型类型类型类型n n 为了避免联表查询,有时候可以适当的数据冗余,比如为了避免联表查询,有时候可以适当的数据冗余,比如为了避免联表查询,有时候可以适当的数据冗余,比如为了避免联表查询,有时候可以适当的数据冗余,比如 邮箱、姓名这些不容易更改的数据邮箱、姓名这些不容易更改的数据邮箱、姓名这些不容易更改的数据邮箱、姓名这些不容易更改的数据n n 选择合适的表引擎,有时候选择合适的表引擎,有时候选择合适的表引擎,有时候选择合适的表引擎,有时候 MyISAMMyISAM适合,有时候适合,有时候适合,有时候适合,有时候 InnoDBInnoDB适合适合适合适合n n 为保证查询性能,最好每个表都建立有为保证查询性能,最好每个表都建立有为保证查询性能,最好每个表都建立有为保证查询性能,最好每个表都建立有 auto_incrementauto_increment字段,字段,字段,字段,建立合适的数据库索引建立合适的数据库索引建立合适的数据库索引建立合适的数据库索引n n 最好给每个字段都设定最好给每个字段都设定最好给每个字段都设定最好给每个字段都设定 defaultdefault值值值值应用优化应用优化索引建立原则索引建立原则索引建立原则索引建立原则(一一一一)n n 一般针对数据分散的关键字进行建立索引,比如一般针对数据分散的关键字进行建立索引,比如一般针对数据分散的关键字进行建立索引,比如一般针对数据分散的关键字进行建立索引,比如IDID、QQQQ,像性别、状态值等等建立索引没有意义像性别、状态值等等建立索引没有意义像性别、状态值等等建立索引没有意义像性别、状态值等等建立索引没有意义n n字段唯一,最少,不可为字段唯一,最少,不可为字段唯一,最少,不可为字段唯一,最少,不可为nullnullnullnulln n对大数据量表建立聚集索引,避免更新操作带来的碎片。对大数据量表建立聚集索引,避免更新操作带来的碎片。对大数据量表建立聚集索引,避免更新操作带来的碎片。对大数据量表建立聚集索引,避免更新操作带来的碎片。n n 尽量使用短索引,一般对尽量使用短索引,一般对尽量使用短索引,一般对尽量使用短索引,一般对intint、char/varcharchar/varchar、date/timedate/time等等等等类型的字段建立索引类型的字段建立索引类型的字段建立索引类型的字段建立索引n n 需要的时候建立联合索引,但是要注意查询需要的时候建立联合索引,但是要注意查询需要的时候建立联合索引,但是要注意查询需要的时候建立联合索引,但是要注意查询SQLSQL语句的编写语句的编写语句的编写语句的编写n n谨慎建立谨慎建立谨慎建立谨慎建立 unique unique unique unique 类型的索引(唯一索引)类型的索引(唯一索引)类型的索引(唯一索引)类型的索引(唯一索引)大文本字段不建立为索引,如果要对大文本字段进行检索,大文本字段不建立为索引,如果要对大文本字段进行检索,大文本字段不建立为索引,如果要对大文本字段进行检索,大文本字段不建立为索引,如果要对大文本字段进行检索,可以考虑全文索引可以考虑全文索引可以考虑全文索引可以考虑全文索引 频繁更新的列不适合建立索引频繁更新的列不适合建立索引频繁更新的列不适合建立索引频繁更新的列不适合建立索引n n一般建议每条记录最好有一个能快速定位的独一无二定位的一般建议每条记录最好有一个能快速定位的独一无二定位的一般建议每条记录最好有一个能快速定位的独一无二定位的一般建议每条记录最好有一个能快速定位的独一无二定位的唯一标示(索引)唯一标示(索引)唯一标示(索引)唯一标示(索引)n n 不要过度索引,单表建立的索引不要超过不要过度索引,单表建立的索引不要超过不要过度索引,单表建立的索引不要超过不要过度索引,单表建立的索引不要超过5 5个,否则更新索个,否则更新索个,否则更新索个,否则更新索引将很耗时引将很耗时引将很耗时引将很耗时应用优化应用优化索引建立原则索引建立原则索引建立原则索引建立原则(二二二二)1.order by 1.order by 1.order by 1.order by 字句中的字段,字句中的字段,字句中的字段,字句中的字段,where where where where 子句中字段,最常用的子句中字段,最常用的子句中字段,最常用的子句中字段,最常用的sql sql sql sql 语句中字段,应建立索引。语句中字段,应建立索引。语句中字段,应建立索引。语句中字段,应建立索引。2.2.2.2.唯一性约束,系统将默认为改字段建立索引。唯一性约束,系统将默认为改字段建立索引。唯一性约束,系统将默认为改字段建立索引。唯一性约束,系统将默认为改字段建立索引。3.3.3.3.对于只是做查询用的数据库索引越多越好,但对于在线实时对于只是做查询用的数据库索引越多越好,但对于在线实时对于只是做查询用的数据库索引越多越好,但对于在线实时对于只是做查询用的数据库索引越多越好,但对于在线实时 系统建议控制在系统建议控制在系统建议控制在系统建议控制在5 5 5 5个以内。个以内。个以内。个以内。4.4.4.4.索引不仅能提高查询索引不仅能提高查询索引不仅能提高查询索引不仅能提高查询SQLSQLSQLSQL性能,同时也可以提高带性能,同时也可以提高带性能,同时也可以提高带性能,同时也可以提高带wherewherewherewhere字句字句字句字句 的的的的updateupdateupdateupdate,Delete SQLDelete SQLDelete SQLDelete SQL性能。性能。性能。性能。5.Decimal 5.Decimal 5.Decimal 5.Decimal 类型字段不要单独建立为索引,但覆盖索引可以包类型字段不要单独建立为索引,但覆盖索引可以包类型字段不要单独建立为索引,但覆盖索引可以包类型字段不要单独建立为索引,但覆盖索引可以包 含这些字段。含这些字段。含这些字段。含这些字段。6.6.6.6.只有建立索引以后,表内的行才按照特地的顺序存储,按照只有建立索引以后,表内的行才按照特地的顺序存储,按照只有建立索引以后,表内的行才按照特地的顺序存储,按照只有建立索引以后,表内的行才按照特地的顺序存储,按照 需要可以是需要可以是需要可以是需要可以是ascascascasc或或或或descdescdescdesc方式。方式。方式。方式。7.7.7.7.如果索引由多个字段组成将最用来查询过滤的字段放在前面如果索引由多个字段组成将最用来查询过滤的字段放在前面如果索引由多个字段组成将最用来查询过滤的字段放在前面如果索引由多个字段组成将最用来查询过滤的字段放在前面 可能会有更好的性能。可能会有更好的性能。可能会有更好的性能。可能会有更好的性能。应用优化应用优化MYSQL MYSQL MYSQL MYSQL 执行顺序执行顺序执行顺序执行顺序(8)SELECT(9)DISTINCT(11)(8)SELECT(9)DISTINCT(11)(8)SELECT(9)DISTINCT(11)(8)SELECT(9)DISTINCT(11)(1)FROM (1)FROM (1)FROM (1)FROM (3)JOIN(3)JOIN(3)JOIN(3)JOIN(2)ON (2)ON (2)ON (2)ON (4)WHERE(4)WHERE(4)WHERE(4)WHERE(5)GROUP BY (5)GROUP BY (5)GROUP BY (5)GROUP BY (6)WITH CUBE|ROLLUP(6)WITH CUBE|ROLLUP(6)WITH CUBE|ROLLUP(6)WITH CUBE|ROLLUP(7)HAVING (7)HAVING (7)HAVING (7)HAVING (10)ORDER BY(10)ORDER BY(10)ORDER BY(10)ORDER BY http:/ SQL(SQL(SQL(SQL(一一一一)n n 能够快速缩小结果集的能够快速缩小结果集的能够快速缩小结果集的能够快速缩小结果集的 WHEREWHERE条件写在前面,如果有恒量条件,条件写在前面,如果有恒量条件,条件写在前面,如果有恒量条件,条件写在前面,如果有恒量条件,也尽量放在前面也尽量放在前面也尽量放在前面也尽量放在前面n n 尽量避免使用尽量避免使用尽量避免使用尽量避免使用 GROUPBYGROUPBY、DISTINCTDISTINCT、OROR、ININ等语句的使用,等语句的使用,等语句的使用,等语句的使用,避免使用联表查询和子查询,因为将使执行效率大大下降避免使用联表查询和子查询,因为将使执行效率大大下降避免使用联表查询和子查询,因为将使执行效率大大下降避免使用联表查询和子查询,因为将使执行效率大大下降n n 能够使用索引的字段尽量进行有效的合理排列,如果使用了能够使用索引的字段尽量进行有效的合理排列,如果使用了能够使用索引的字段尽量进行有效的合理排列,如果使用了能够使用索引的字段尽量进行有效的合理排列,如果使用了联合索引,请注意提取字段的前后顺序联合索引,请注意提取字段的前后顺序联合索引,请注意提取字段的前后顺序联合索引,请注意提取字段的前后顺序n n 针对索引字段使用针对索引字段使用针对索引字段使用针对索引字段使用,=,=,=,=,10000;优化后优化后:Selectidfromuinfo_jifenwherejifen600000;2.2.尽量不要在尽量不要在尽量不要在尽量不要在wherewhere条件中使用函数,否则将不能使用索引条件中使用函数,否则将不能使用索引条件中使用函数,否则将不能使用索引条件中使用函数,否则将不能使用索引(selectuidfromimidwheredatediff(create_time,2011-11-22)=0优化后优化后selectuidfromimidwherecreate_time=2011-11-21andcreate_time2011-11-23;)3.3.避免使用避免使用避免使用避免使用 select*,select*,只取需要的字段只取需要的字段只取需要的字段只取需要的字段4.4.对于大数据量的查询,尽量避免在对于大数据量的查询,尽量避免在对于大数据量的查询,尽量避免在对于大数据量的查询,尽量避免在SQLSQL语句中使用语句中使用语句中使用语句中使用orderbyorderby字句,避免字句,避免字句,避免字句,避免额为的开销额为的开销额为的开销额为的开销5.5.如果插入的数据量很大,用如果插入的数据量很大,用如果插入的数据量很大,用如果插入的数据量很大,用selectintoselectinto替代替代替代替代 insertintoinsertinto能带来更好的性能能带来更好的性能能带来更好的性能能带来更好的性能6.6.采用连接操作,避免过多的子查询,产生的采用连接操作,避免过多的子查询,产生的采用连接操作,避免过多的子查询,产生的采用连接操作,避免过多的子查询,产生的CPUCPU和和和和IOIO开销开销开销开销7.7.只关心需要的表和满足条件的数据只关心需要的表和满足条件的数据只关心需要的表和满足条件的数据只关心需要的表和满足条件的数据8.8.适当使用临时表或表变量适当使用临时表或表变量适当使用临时表或表变量适当使用临时表或表变量9.9.对于连续的数值,使用对于连续的数值,使用对于连续的数值,使用对于连续的数值,使用betweenbetween代替代替代替代替inin11.11.尽量不用触发器,尽量不用触发器,尽量不用触发器,尽量不用触发器,10.where10.where字句中尽量不要使用字句中尽量不要使用字句中尽量不要使用字句中尽量不要使用CASECASE条件条件条件条件特别是在大数据表上特别是在大数据表上特别是在大数据表上特别是在大数据表上应用优化应用优化编写高效的编写高效的编写高效的编写高效的 SQL(SQL(SQL(SQL(三三三三)1.1.更新触发器如果不是所有情况下都需要触发,应根据业务需要加更新触发器如果不是所有情况下都需要触发,应根据业务需要加更新触发器如果不是所有情况下都需要触发,应根据业务需要加更新触发器如果不是所有情况下都需要触发,应根据业务需要加上必要判断条件上必要判断条件上必要判断条件上必要判断条件2.2.使用使用使用使用unionallunionall操作代替操作代替操作代替操作代替OROR操作,注意此时需要注意一点查询条操作,注意此时需要注意一点查询条操作,注意此时需要注意一点查询条操作,注意此时需要注意一点查询条件可以使用聚集索引,如果是非聚集索引将起到相反的结果件可以使用聚集索引,如果是非聚集索引将起到相反的结果件可以使用聚集索引,如果是非聚集索引将起到相反的结果件可以使用聚集索引,如果是非聚集索引将起到相反的结果3.3.当只要一行数据时使用当只要一行数据时使用当只要一行数据时使用当只要一行数据时使用 LIMIT1LIMIT14.4.尽可能的使用尽可能的使用尽可能的使用尽可能的使用 NOTNULLNOTNULL填充数据库填充数据库填充数据库填充数据库5.5.拆分大的拆分大的拆分大的拆分大的 DELETEDELETE或或或或 INSERTINSERT语句语句语句语句,使用使用LIMIT条件是一个好的方法条件是一个好的方法while(1)/每次只做每次只做1000条条mysql_query(DELETEFROMlogsWHERElog_date=2009-11-01LIMIT1000);if(mysql_affected_rows()=0)/没得可删了,退出!没得可删了,退出!break;/每次都要休息一会儿每次都要休息一会儿usleep(50000);6.6.批量提交批量提交批量提交批量提交SQLSQL语句语句语句语句MySQLMySQL技巧分享技巧分享MySQLMySQL技巧分享技巧分享常用技巧常用技巧常用技巧常用技巧n n使用使用使用使用 SHOWPROCESSLISTSHOWPROCESSLIST来查看当前来查看当前来查看当前来查看当前MySQLMySQL服务器线程服务器线程服务器线程服务器线程执行情况,是否锁表,查看相应的执行情况,是否锁表,查看相应的执行情况,是否锁表,查看相应的执行情况,是否锁表,查看相应的SQLSQL语句语句语句语句n n 设置设置设置设置 my.inimy.ini中的中的中的中的 long-query-timelong-query-time和和和和 log-slow-querieslog-slow-queries能够记能够记能够记能够记录服务器录服务器录服务器录服务器哪哪哪哪些些些些SQLSQL执行速度比较慢执行速度比较慢执行速度比较慢执行速度比较慢n n使用使用使用使用 DESCTABLExxxDESCTABLExxx来查看表结构,使用来查看表结构,使用来查看表结构,使用来查看表结构,使用 SHOWINDEXSHOWINDEXFROMxxxFROMxxx来查看表索引来查看表索引来查看表索引来查看表索引n n 使用使用使用使用 LOADDATALOADDATA导入数据比导入数据比导入数据比导入数据比 INSERTINTOINSERTINTO快多了快多了快多了快多了n n SELECTCOUNT(*)FROMTblSELECTCOUNT(*)FROMTbl在在在在 InnoDB要扫描一遍整要扫描一遍整个表来计算有多少行,但是个表来计算有多少行,但是MyISAM只要简单的读出保存只要简单的读出保存好的行数即可。注意的是,当好的行数即可。注意的是,当count(*)语句包含语句包含where条件条件时,两种表的时,两种表的操作操作是一样的。是一样的。MySQLMySQL技巧分享技巧分享SELECT查询的速度查询的速度要想使一个较慢速要想使一个较慢速SELECT.WHERE更快,应首先检查是否更快,应首先检查是否能增加一个索引。你可以使用能增加一个索引。你可以使用EXPLAIN语句来确定语句来确定SELECT语句使用语句使用哪些索引。哪些索引。为了帮助为了帮助MySQL更好地优化查询,在一个装载数据后的表上更好地优化查询,在一个装载数据后的表上运行运行ANALYZETABLE或或myisamchk-analyze。这样为每一个索引更这样为每一个索引更新指出有相同值的行的平均行数的值(当然,如果只有一个索引,这新指出有相同值的行的平均行数的值(当然,如果只有一个索引,这总是总是1。)。)MySQL使用该方法来决定当你联接两个基于非常量表达式使用该方法来决定当你联接两个基于非常量表达式的表时选择哪个索引。你可以使用的表时选择哪个索引。你可以使用SHOWINDEXFROMtbl_name并并检查检查Cardinality值来检查表分析结果。值来检查表分析结果。myisamchk-description-verbose可以显示索引分布信息。可以显示索引分布信息。要想根据一个索引排序一个索引和数据,使用要想根据一个索引排序一个索引和数据,使用myisamchk-sort-index-sort-records=1(如果你想要在索引如果你想要在索引1上排序)。如果只有上排序)。如果只有一个索引,想要根据该索引的次序读取所有的记录,这是使查询更快一个索引,想要根据该索引的次序读取所有的记录,这是使查询更快的一个好方法。但是请注意,第一次对一个大表按照这种方法排序时的一个好方法。但是请注意,第一次对一个大表按照这种方法排序时将花很长时间!将花很长时间!MySQLMySQL技巧分享技巧分享 使用使用使用使用 ExplainExplain语句来帮助改进我们的语句来帮助改进我们的语句来帮助改进我们的语句来帮助改进我们的SQLSQL语句语句语句语句n如果在如果在SELECT语句前放上关键词语句前放上关键词EXPLAIN,MySQL将解释它如何处将解释它如何处理理SELECT,提供有关表如何联接和联接的次序。,提供有关表如何联接和联接的次序。EXPLAIN的每个输出行提供一个表的相关信息,并且每个行包括下面的列的每个输出行提供一个表的相关信息,并且每个行包括下面的列:idSELECT识别符。这是SELECT的查询序列号select_typeSELECT类型table输出的行所引用的表type联接类型possible_keyspossible_keys列指出MySQL能使用哪个索引在该表中找到行keykey列显示MySQL实际决定使用的键(索引)key_lenkey_len列显示MySQL决定使用的键长度refref列显示使用哪个列或常数与key一起从表中选择行rowsrows列显示MySQL认为它执行查询时必须检查的行数Extra该列包含MySQL解决查询的详细信息MySQLMySQL技巧分享技巧分享MySQL MySQL 技巧分享技巧分享ExplainExplainExplainExplain效率检测效率检测效率检测效率检测使用使用使用使用n n 语法:语法:语法:语法:EXPLAINSELECTEXPLAINSELECTselect_optionsselect_optionsType:Type:类型,是否使用了索引还是全表扫描类型,是否使用了索引还是全表扫描类型,是否使用了索引还是全表扫描类型,是否使用了索引还是全表扫描,const,eg_reg,ref,range,index,ALL,const,eg_reg,ref,range,index,ALLKey:Key:实际使用上的索引是哪个字段实际使用上的索引是哪个字段实际使用上的索引是哪个字段实际使用上的索引是哪个字段 Ken_len:Ken_len:真正使用了哪些索引,不为真正使用了哪些索引,不为真正使用了哪些索引,不为真正使用了哪些索引,不为 NULLNULL的就是真实使用的索引的就是真实使用的索引的就是真实使用的索引的就是真实使用的索引Ref:Ref:显示了哪些字段或者常量被用来和显示了哪些字段或者常量被用来和显示了哪些字段或者常量被用来和显示了哪些字段或者常量被用来和 keykey配合从表中查询记录出来配合从表中查询记录出来配合从表中查询记录出来配合从表中查询记录出来 Rows:Rows:显示了显示了显示了显示了MySQLMySQL认为在查询中应该检索的记录数认为在查询中应该检索的记录数认为在查询中应该检索的记录数认为在查询中应该检索的记录数 Extra:Extra:显示了查询中显示了查询中显示了查询中显示了查询中MySQLMySQL的附加信息,关心的附加信息,关心的附加信息,关心的附加信息,关心UsingfilesortUsingfilesort和和和和 UsingtemporaryUsingtemporary,性能杀手,性能杀手,性能杀手,性能杀手MySQL MySQL 技巧分享技巧分享函数和索引函数和索引函数和索引函数和索引MySQL MySQL 技巧分享技巧分享使用使用使用使用 UNION UNION UNION UNION 来取代来取代来取代来取代 IN IN IN IN 和和和和 OROROROR原原原原SQLSQL:select*fromcitywhereidin(1,3,4)select*fromcitywhereidin(1,3,4)或或或或 select*fromcitywhereid=1orid=3orid=4select*fromcitywhereid=1orid=3orid=4explain explain 结果:结果:结果:结果:idselect_typetabletypepossible_keyskeykey_lenrefrowsExtraidselect_typetabletypepossible_keyskeykey_lenrefrowsExtra1 1SIMPLESIMPLE citycity ALLALLPRIMARYPRIMARYNULLNULLNULLNULLNULLNULL5 5UsingwhereUsingwhere 修改后修改后修改后修改后SQLSQL:SELECT*FROMcitywhereid=1SELECT*FROMcitywhereid=1UNIONALLSELECT*FROMcitywhereid=3UNIONALLSELECT*FROMcitywhereid=3UNIONALLSELECT*FROMcityUNIONALLSELECT*FROMcityexplain explain 结果:结果:结果:结果:ididselect_typetableselect_typetabletypepossible_keyskeytypepossible_keyskeykey_lenrefkey_lenrefrowsExtrarowsExtra1 1PRIMARYcityPRIMARYcityconstPRIMARYconstPRIMARYPRIMARY4PRIMARY4 const1const1 2 2UNIONUNIONcitycityconstPRIMARYconstPRIMARYPRIMARY4PRIMARY4 const1const1 3 3UNIONUNIONcitycityconstPRIMARYconstPRIMARYPRIMARY4PRIMARY4 const1const1 MySQL MySQL 技巧分享技巧分享MySQLMySQLMySQLMySQL优化网站优化网站优化网站优化网站n nMySQLMySQL优化专区优化专区优化专区优化专区n nMySQLMySQL参考手册参考手册参考手册参考手册:优化优化优化优化MySQLMySQL函数函数MySQL MySQL 函数函数MySQLMySQLMySQLMySQL函数分为几种类型函数分为几种类型函数分为几种类型函数分为几种类型:n控制流程函数控制流程函数n字符串比较函数字符串比较函数n数学函数数学函数n日期和时间函数日期和时间函数n全文搜索功能全文搜索功能函数函数n加密加密函数函数n信息函数信息函数n其他函数其他函数详细介绍参见详细介绍参见mysql函数函数MySQL MySQL 函数函数n控制流程控制流程函数函数CASEWHENTHEN函数函数IF函数函数IFNULL函数函数n全文全文搜索功能搜索功能函数函数SELECT*FROMcategoryWHEREMATCH(catname)AGAINST(this)mysql指定了最小字符长度,默认是指定了最小字符长度,默认是4SELECT*FROMcategoryWHEREMATCH(catname)AGAINST(you)mysql默认的阀值是默认的阀值是50%(关键词权重关键词权重)只有低于只有低于50%的才会出现在结果集中。的才会出现在结果集中。结束结束谢谢大家!谢谢大家!