MySQL常见注意事项及优化

MySQL常见注意事项

  1. 模糊查询 like 默认是对name字段建立了索引

    注意:在使用模糊查询的时候,当% 在第一个字母的位置的时候,这个时候索引是无法被使用的。但是% 在其他的位置的时候,索引是可以被使用的。

    ?

    # select * from tableName where name like "%zhangsan"; ?可以使用到索引啊? 不可以。

    分析:因为是不确定查询,在表中任何一行记录都有可能满足查询条件。

    ?

    #select * from tableName where name like "zh%"; 可以使用吗? 可以

    #select * from tableName where name like "zh%三"; 可以使用吗? 可以

    # select * from tableName where name like "z%san"; ? 可以使用吗?可以,首先可以快速定位z字母开头的部分。读z字母这段范围之内只能逐行比较。

    ?

  2. 对查询的列不要使用函数或者运算。否则索引无法使用。

    # select * from tableName where id+1 = 1000;

    # select * from tableName where id = 999; 等价。

    ?

    ?

    有的时候,会在查询字段上面使用函数。使用函数的时候也是无法使用所有的,一般的解决方案是将查询后的结果交给php程序(字符串 和 数组)来实现处理。不要把函数的处理放在MySQL里面完成。

    ?

  3. 在你开发之中,什么样的字段适合建立索引?简述为什么?

    答:

  4. 在where后面作为查询条件的字段是适合建立索引的。

    1. 注意:对于唯一很差的字段不适合建立索引,例如 只有 男 和 女 这两种情况的字段。
  5. 在需要排序的字段上面,也可以建立索引。

    ?

    执行order by 不加限定,全表扫描,filesort含义 注意:问题?

    ?

  6. MySQL优化的一个通用方案?

    答:

  7. 开启MySQL的慢查询记录功能,让系统运行一段时间(测试时间 都是在半个月到一个月时间)
  8. 检查慢查询的日志信息,分析出可能有问题的sql语句
  9. 使用profile工具详细去分析sql语句执行的时候,每个步骤所花费的时间,sending data(可能出现的问题 是MySQL没有使用索引的情况下,会去磁盘上获取数据:经验)
  10. 对sql语句优化(本身写出来的sql语句就存在问题,例如对查询的字段使用了函数)或者对表的结构(表中有些查询字段没有建立索引)适当的做一些调整(索引重建或者建立的更合适)
  11. 使用explain工具分析一下这些sql语句在执行的时候,是如何执行(可能使用索引或者是使用那些索引)

    1. type: const \ index \ 出现这些 代表索引正常使用
  12. 反复上面的过程具体分析。

    ?

  13. MySQL的自身缓存

    解释:MySQL的客户端在发送sql语句到MySQL服务器端之后,会先去检查一下权限,之后去查询该条sql语句的缓存信息是否存在,如果存在,则直接返回;如果不存在,MySQL服务器需要去分析该sql语句,做词法语法分析,然后编译,生产执行树,去磁盘上获取数据,获取数据后,缓存到自身的一个缓存容器里面,然后在返回数据。

    ?

    使用:

    # show variables like "%cache%";

    更改MySQL缓存的大小(32M),注意 单位是 B(字节)

    # set global query_cache_size = 1024*1024*32;

    注意:第一个是要加关键字 global 第二个是大小的单位为 B(字节) 第三具体给多少合适,取决于自身操作系统的内存大小。

    测试对比:

    ?

    注意:MySQL自身的缓存需要注意两点:

  14. MySQL的sql语句里面不能出现不确定信息(例如在条件里面使用 now()函数),MySQL的自身缓存将无法被使用。查询的结构不会被缓存起来。

    分析:

    ?

  15. MySQL的自身的缓存是严格基于 sql 语句的(MySQL自身缓存是严格区分sql语句的大小写的) select === SELECT 关键字 其实是一样的

    ?

    ?

  16. MySQL的架构分析(读写分离)

    由于一个网站业务中 70%的业务基本都是读操作,剩下的都是写操作。所以这个时候对读的压力过大,需要使用一定的方式来减少压力,这个时候可以使用读写分离这种架构来实现压力的分担。

    怎么查询是读为主?

    # show status like "%Com_%";

    通过上面的分析一段时间,就可以大致计算出网站的读写情况

    ?

    # show status ; 可以查看MySQL的一个状态信息。

    ?

    ?

    ?

    读写分离概图:

    mysql-proxy这个工具可以实现对sql语句的分析,判断sql语句是读操作(select关键字) 还是 写操作(insert、update、delete)。最后去连接不同的服务器实现业务的完成。

    当完成读的时候,MySQL-proxy会从对台读服务器按照一定策略去选择一台(轮询、加权、ip_hash)完成读操作

    当完成写的时候,直接去连接写的服务器

    ?

    问题:

    由于数据只在主服务器上实现写操作,但是从服务器上是没有完成写操作的,这个时候数据就会不一致。

    需要解决一致性的问题?

    答:可以使用MySQL的一个bin日志来完成数据的一致性问题。

    ?

    使用步骤:

    主服务器配置:

  17. 先在主服务器上开启bin日志(bin日志是MySQL的一个二进制日志功能,可以记录对MySQL数据造成更改的sql语句,形成一个日志文件)
  18. 在主服务器上的配置文件里面定义一个 server_id = Number 相当于标示一下这个服务器
  19. 在主服务器上添加一个授权账号用来到时候获取bin日志。

    ?

    从服务器配置:

  20. 开启从服务器的一个中继日志,这个日志主要是把主服务器bin日志读取之后(无法直接使用,需要先转换为中继日志),形成转换。
  21. 在从服务器上的配置文件定义一个 server_id =Number 不要和主服务器重复
  22. 使用主服务器的授权账号去链接主服务器获取bin日志,然后读取到本地,形成中级日志,然后在本地的MySQL执行一遍,达到和主服务器上数据文件一致。
  23. 启动从服务器的主从复制功能。

    ?

    总结:主从复制是完成读写分离的一个基础。(稍微有点延时)

    ?

    优化技术

    索引覆盖

    对于MyISAM的存储引擎来说,如果查询的字段信息正好在索引文件里面出现,这个时候不需要做回行的操作,直接可以从索引文件里面返回的现象就叫做索引覆盖。(索引正好覆盖了查询的字段)

    ?

    应用:在大数据(百万数据)下的一个翻页效果

    技术点:翻页是如何做的?

    答:select * from tableName limit offset,page;

    好比现在是N页,每页显示page条

    offset = (N-1) * page

    ?

    实际使用:

    分页操作

    当很大页码的时候

    ?

    通过上面的对比发现,MySQL在使用limit分页的时候,在页码足够大的情况下,效率是很低的,为什么?

    答:主要原因是,MySQL在使用limit做查询的时候,如下sql:

    select * from tableName limit offset,page;

    执行过程:

    先取出 offset+page 条记录, 然后在丢弃 offset 条记录 ,返回 page 条记录。

    所以有必要对这种情况做优化操作:

    ?

  24. 从业务上完成(限制用户的行为,不允许翻页超过规定的页码)

    百度限制用户行为:

    ?

  25. 不从限制用户的行为上去考虑,可以使用索引来实现。

    1. select * from tableName where id > Number limit page;

    当分页页码变大的情况下:

    通过使用 where id > Number limit 10; 这样由于可以使用上id的主键索引,所以可以快速的定位,达到一个大数据的分页的效果。

    ?

    ?

    问题:

    a. select * from tableName where id > Number limit page;

    b. select * from tableName limit Number, page;

    ?

    当上面的这两条sql语句执行后,结果在什么时候完全一致,什么时候不一致?

    答:当数据没有被物理行删除的时候。这个时候数据是一致的,但是有物理行删除的时候,数据是不一致的。

    如何解决上面的问题?

    答:既然是物理行删除造成的,那就不做物理行的删除,只做逻辑删除(设置一个is_delete 字段 0 代表没有删除 1 代表已经删除)。

    使用逻辑删除之后,数据会一致,只要在数据显示的,在显示层面(HTML)让is_delete=1 不显示出来即可。if( is_delete == 1) echo ‘该条信息已被删除!‘ 例如:常见的百度贴吧,网易新闻端。

    ?

    3. 实现物理行删除,不限制用户行为

    答:这个时候可以使用 索引覆盖 + 延时关联技巧 来实现。

    分析:

    程序代码实现:

    在php层面实现????????

  26. 由于主键id是可以快速查找,先查出满足条件id

    ?

  27. 然后根据id快速的去查找对应的记录

    foreach($data as $k=>$v){

    $sql = select * from tableName where id = $v;

    $res = mysql_query($sql);

    $row = mysql_fetch_assoc($res);

    $result[]= $row;

    }

    $result //分页数据

    ?

    在MySQL层面联表处理:

    使用联表来完成大数据的分页操作

    ?

    解释

时间: 2024-10-04 04:03:00

MySQL常见注意事项及优化的相关文章

Mysql常见注意事项小记

1. 排序问题 正常如果按照某字段升序排列,空值会排到有值的前面;如果逆序排序空值排在最后. 有时候我们需要该字段为空的行数据要排到最后面去,这时只需要: order by second_parent_name is null, second_parent_name, user_name 原文地址:https://www.cnblogs.com/qlqwjy/p/11564308.html

MYSQL常见的可优化点

MYSQL常见的可优化点 SQL常见的可优化点 2014年6月8日 DBA 发表回复 # #################################################### 索引相关# ###################################################1. 查询(或更新,删除,可以转换为查询)没有用到索引这是最基础的步骤,需要对sql执行explain查看执行计划中是否用到了索引,需要重点关注type=ALL, key=NULL的字段.

apache+php+mysql常见集成环境安装包

http://www.thinksaas.cn/group/topic/33/ apache+php+mysql是常见php环境,在windows下也称为WAMP,对于初学者自选版本搭建总是会遇到一些麻烦,下面是收集到的一些集成环境安装:1.AppServ(推荐,简洁精简)主页http://www.appservnetwork.com/当前的两个版本是:2.5.102.6.0(点击版本号下载) AppServ是PHP网页架站工具组合包,泰国的作者将一些网路上免费的架站资源重新包装成单一的安装程序

MySQL my.cnf参数配置优化详解

http://leeyin.iteye.com/blog/1459274 [b]PS:本配置文件针对Dell R710,双至强E5620.16G内存的硬件配置.CentOS 5.6 64位系统,MySQL 5.5.x 稳定版.适用于日IP 50-100w,PV 100-300w的站点,主要使用InnoDB存储引擎.其他应用环境请根据实际情况来设置优化.[/b] # 以下选项会被MySQL客户端应用读取. # 注意只有MySQL附带的客户端应用程序保证可以读取这段内容. # 如果你想你自己的MyS

mysql索引的使用和优化

参考: http://blog.csdn.net/xluren/article/details/32746183 http://www.cnblogs.com/hustcat/archive/2009/10/28/1591648.html 关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车.对于没有索引的表,单表查询可能几十万数据就是瓶颈,而通常大型网站单日就可能会产生几十万甚至几百万的数据,没有索引查询会变

hive的查询注意事项以及优化总结 .

一.控制Hive中Map和reduce的数量 Hive中的sql查询会生成执行计划,执行计划以MapReduce的方式执行,那么结合数据和集群的大小,map和reduce的数量就会影响到sql执行的效率. 除了要控制Hive生成的Job的数量,也要控制map和reduce的数量. 1. map的数量,通常情况下和split的大小有关系,之前写的一篇blog“map和reduce的数量是如何定义的”有描述. hive中默认的hive.input.format是org.apache.hadoop.h

Mysql索引详解及优化(key和index区别)

MySQL索引的概念 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针.更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度. 索引分为聚簇索引和非聚簇索引两种,聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了:聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快 要注意的是,建立太多的索引将会影响更新和插入的速度,因为它需要同样更新每个索引文件.对于一个经常需要更新和插入的表格,就没有必要为

MySQL常见命令及核心知识资料汇总

MySQL常见命令总结及资料汇总(资料链接在最后) 一.服务启动与停止命令 net start mysql (启动服务) net stop mysql (终止服务) 二.登录登出命令 mysql -u用户名 -p密码 -h连接的主机IP -p端口号 (登录) exit.quit(登出) 三.修改密码命令 1.登录mysql: 2.use mysql; 3.update user set password=PASSWORD('新密码') where user='用户名'; 4.flush priv

MySQL常见架构的应用

MySQL 的架构设计 MySQL 架构一定要结合前台业务来设计.优化,所以不管是哪种架构.根据业务要求组合成符合需求的即是最好的.不能泛泛而谈同时.也必须注意数据的安全(如ipsec,ssh,vpn传输) MySQL常见的架构 MySQL常见的架构都是进行业务切分.前端缓存.分库分表.若是过亿的查询量则先从业务上拆分.将 bbs.web.blog 分成几个组.然后再做成一主多从.读写分离的方式而且.在设计表的时候.一般情况下.备库常充当起备份查询的作用,至于.读写分离.在程序设计之初.读和写是