MySQL常见注意事项


  • 模糊查询 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字母这段范围之内只能逐行比较。

     

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

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

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

     

     

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

     

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

    答:

  • 在where后面作为查询条件的字段是适合建立索引的。
    1. 注意:对于唯一很差的字段不适合建立索引,例如 只有 这两种情况的字段。
  • 在需要排序的字段上面,也可以建立索引。

     

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

     

  • MySQL优化的一个通用方案?

    答:

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

     

  • 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自身的缓存需要注意两点:

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

    分析:

     

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

     

     

  • MySQL的架构分析(读写分离

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

    怎么查询是读为主?

    # show status like "%Com_%";

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

     

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

     

     

     

    读写分离概图:

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

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

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

     

    问题:

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

    需要解决一致性的问题?

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

     

    使用步骤:

    主服务器配置:

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

     

    从服务器配置:

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

     

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

     

     

更多详情见请继续阅读下一页的精彩内容

  • 1
  • 2
  • 下一页

相关内容

    暂无相关文章