mysql 优化记录

现在我总结了一下自己优化sql语句的心得和步骤。可能不一定都正确。我一般把优化数据库分为两大步骤:一:
1.使用optimize table 去清理物理碎片。
2.我会考虑一下我该用什么存储引擎。经常用到的以下两种。
3.myisam 该存储引擎,不支持事务安全,不支持外键。查询速度会比下面的INNODB快。 4.innodb.支持事务,支持外键。(注意在生产环境中的外键是种形式。)查询速度会比myisam慢一点。你打开配置文件可以看到,基本默认都是这个存储引擎。alert table table_name engine=存储引擎名字。create table name()engine=引擎名。
二:1观察你的应用,让应用跑上几天,看看生产环境下,mysql慢的情况。为什么要这样做?只有让其工作起来,才知道问题,没有万能的优化策略。如果没有出现慢的情况,就不必优化。 2:开启慢查询日志。
开启慢查询日志的步骤如下(如果不是为了调优的话,请不要开启,会影响性能)
> show variables like ‘%slow_query_log%’ ‖ slow_query_log off
该字段值显示是否开启慢查询日志。off为关。默认为关,mysql很多牛☆的功能默认都是关闭的。
>set global slow_query_log=1
提到慢,何为慢,sql中,默认的时间阙值为10,也就是执行一条sql语句超过10秒,就被记录为慢语句。一个应用如果等待一条语句需要反应10,如果在高并发的情况下,可能有的用户需要等到地久天长都没办法使用该应用,你可以想象客户使用时,会满口粗话问候开发者的家人。所以我们要更改这个设置。
查询设置>>show varlables like ‘long_query_time%’| long_query_time 10.00000更改设置>set global long_query_time=时间秒为单位。
我把它设置为3测试测试写法
>select sleep(4)
查看日志文件,文件里会记录了慢语句。日志地址在你开启查询的时候,第二条数据。(在linux下使用mysqldumpslow日志分析。mysqldumpslow ––help)对照命令表使用合种命令,就不陈述了。
3.既然我们可以把把慢语句给找出来,换句话我们得知那些有病,就得找出来病在那里,explain就是专门干这事.
explain +sql语句。执行,得到一系列的数据。捡重要的开始说吧。你执行explain 加sql语句后,你会发现查出一张表,表里有一些字段。现在就开始说说这些字段代表的意思。id代表mysql访问表的顺序,有以下三中情况。id相同,如果id相同,从上往下去访问。
id不同,数值越大,优先级越大。
id相同又不同。结合上面的理论。总而言之,得出的结论就是,id决定了执行顺序,记住小表要驱动大表的原则。一句话可以总结其优先级,id值大优先级越大,id值相等从上往下。记住即可无需理解。
select _type估计你看到该命名就知道它的用法。查询类型。列一些常见的,因为它在我看来作用并不大。simple(简单查询,常见单表)primary(包含子查询)derived(临时表)union(使用到union查询)感觉说了一大堆废话,好吧我们开始讲重点数据。type对应数据性能从好到差的顺序如下。system<const<eq_ref<ref<range<index<all
all为最差,一般使用索引的情况,取决这个值,相对而言,system虽然为最好(null除外),但在生产环境中能优化到ref就非常好。
possible_keys
字段 指可能用到的索引。key 字段 实际用到的索引。这两者结合可以看到你的索引是否失效。key_len 该字段的值越小越好,不过在我看来它并没有多大的作用。ref 显示索引的哪一列被使用,如果可能的话,他是个常数。哪些列或者常量用于查找列的值。
rows: 扫描行的数量,当然是越少越好。Extra: 执行情况的说明和描述。 索引篇
先来举个例子,什么让你明白什么是索引的好处,比如说,你采集了一批草药,你没有把它们分开,等你从其中找出金钱草,是不是很痛苦。例如你收集的时候,把它们放到药柜里,一个格子放一种,而且给格子加上名字,而且名字按照某种规律排序,也许你放的时候,没有比堆一堆随手放一放那么快,但你找的时候就容易多了。
估计初学的时候,索引这一章节老师也是随口提一提,很快你就忘了,而且你也不去建,因为你不体会过它的好处。今天就写一下索引。
索引:是sql中的查找数据的一种数据结构。
我们每一次访问数据库,都是要经过一次io操作,从某个物理内存把数据取出,索引会提高搜索效率,从而减少io成本。
降低cpu的消耗。缺点:增,删,改,速度会受到影响。
类型: 单值索引:一列作为索引 唯一索引:索引值列必须唯一,但可以为空,一般默认,主键列就是唯一索引。
复合索引:包含多列。
创建索引的两种语法
create index indexname on tablename(字段名)单值就是一个字段,多值就是多个字段。
alter tablename add index indexname on(字段名)
查看索引: show index from tablename
删除索引: drop index indexname on tablename;
其中经常使用的语法就这些,和一般sql语法一样简单。
在那些情况下建立索引
1:主键自动创建唯一索引。
2:频繁做为查询条件的列
3:关键其他表的字段,外键字段
4:排序字段
5:分组字段。
那些情况不需要建索引。
1:表记录太少,不要建,原因我说很多次了,记录少更本不需要优化。
2:频繁增删改的字段
3:重复记录过多的字段,例如性别,不是男就是女,不是0便是1,怎么查也只有两种情况。
mysql索引结构
1:BTree
2:Hash
3:full_text
4:R_tree
作为一个开发工程师,主要认识btree即可,其他的知道就行。单表优化索引,记得结合explain。
1.单表查询,一般是建立索引在where后面的字段
2:双表,左连接加在右边,右连接加左边创建复合索引的情况下。
最佳左前缀法,也就是复合索引第一个字段要在查询条件中,第一个字段不能丢失。
中间字段不能断
在索引字段列上做计算也会导致索引失效。
范围之后全失效
is null is not null 失效
如果是字符串要加‘’ 否则会失效(如果是数字,你没加,也不保错,也能查出来。)
like %能放后面,放后面。
如果一定用双%%号
创建覆盖索引。在要查询的字段创建。
少用 or,在能使用union all代替,便使用它代替
order by 后面创索引
show PROFILES
查看看sql使用情况。。。。。
写得不对的地方可以建议建议。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tiny(泰尼)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值