MySQL索引以及优化手段

不走索引的情况:

  • 索引列参与计算
  • 索引列使用了函数
  • 索引列使用了Like %XXX,前缀走索引,后缀不走索引
  • 字符串列与数字直接比较,存在隐式强制转换
  • 不满足最左匹配原则也不会走索引

MySQL优化手段

  • show status like 'com_%'得到各种SQL的执行频率
  • Slow queries log 得到慢查询日志,知道哪些命令执行的慢
  • 通过explain +sql语句得到一条语句执行需要扫描多少行,且其type是什么(ALL,index,range等)
  • 通过show profile得到最近15条sql的执行记录
  • show profile (cpu) for query得到该记录的详细执行报告,在每个操作上耗时。
  • 建立相关的索引提升速度
  • 常用的查询字段最好建立索引
  • 索引建立的时候最好选择重复少的字段
  • 索引建立的时候最好实现覆盖索引
  • 不建议使用过长的字段作为主键,也不建议使用非单调的字段作为主键,这样会造成主索引频繁分裂。
  • 对字符串的相关字段实现索引的时候可以使用前缀索引 alter table table_name add key(column_name(length));
  • 索引太多也可能导致插入删除效率低

优化SQL语句

  1. 插入的时候尽量一次插入数据,不要分成几次完成

  2. oder by语法尽量建立在可以使用索引的情况下完成,如果实在不行,则select的时候只选择最需要的字段,别用*,因为mysql会对数据进行排序,如果数据量小的话可以在内存中完成,速度更快。消耗更多的 CPU 和 IO 以网络带宽资源,无法使用覆盖索引,可减少表结构变更带来的影响

  3. group by默认会对键值排序,如果不需要可以关闭,也就是order by null

  4. 嵌套查询的时候最好换成join连表查询,因为join不用在内存中创建临时表

创建索引:

1.alter table "table_name" add primaty key() / key / index / unique

mysql的三种日志:

  • redolog:记录的是物理变化,用于实现ACID的D(durability)持久性,每次更新数据库先实现redolog,然后再刷新到磁盘,如果断电可以从redolog回复,redolog是顺序写速度比直接改磁盘数据快
  • binlog:mysql自带的,不区分引擎,主要用于主从复制,记录的是逻辑变化,可以理解为每次的插入删除更新的sql语句,主服务器更新数据后,从服务器定期从主服务器的binlog中更新数据
  • undolog:记录的是每次更新语句的反向语句,也就是可以抵消这次更新的语句。主要用于回滚操作,也就是ACID的A实现,并且undolog还可以实现mysql的MVCC多版本并发控制的快照读操作。
    MySQL三种日志详解
全部评论

相关推荐

点赞 评论 收藏
分享
希望各位大哥分享一下自己的看法,对于机器人行业确实不太了解
绝顶但不聪明:如果是机器人相关岗位,优先优必选(专门***器人的),其他岗位选小米
投递小米集团等公司10个岗位 > 牛客解忧铺 牛客在线求职答疑中心
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务