Mysql使用index基本原则


Posted on July 23rd 2014, 09:24


用了蛮久的mysql,竟然对如何优化index还没有掌握,今天闲下来看看这块东西,然后总结以下.这里所表述的mysql指的是innodb的engine.

mysql index分类

Mysql的index分为cluster index和secondary index, 可以翻译为聚簇索引和二级索引.所谓的聚簇索引是指主键栏作为索引值的索引, 而所有非聚簇索引则是二级索引.

cluster index

Mysql根据如下规则建立聚簇索引:

  • 如果有定义主键, 则使用主键建立索引
  • 如果没有定义主键, 选取第一个UNIQUE的栏建立索引
  • 如果以上两个条件均不满足, 则mysql默认建立一个隐藏的rowid作为建立索引的依据

secondary index

二级索引是建立在cluster index之上的索引, 它包含建立自身索引的列和主键, 因此, 主键过大会造成二级索引过大, 最终导致磁盘占用量变大.
Myql如果选择使用二级索引, 那么它先根据二级索引查找主键, 由于主键和数据在同一个页上, 从而加快了数据的查找和比较.

mysql如何使用index

Mysql首先根据查询语句做优化, 如果table的数据量很小(比如几条数据),那么mysql会选择遍历整个表.如果数据量很大, 它优先选择根据索引过滤后数据量较小的索引.那么我们建立索引索引的时候应该遵循哪些规则?

尽可能的覆盖查询语句中的查询条件

由于mysql可以选取部分index的列作为索引条件,因此如下两个查询条件可以共用同一个索引但是不要忘记, 增加列意味着容量的增加.

select * from db.tbl where c1 = 1 and c2 = 2;  

select * from db.tbl where c1 = 1;  

所以语句

create index inx_c1_c2 on db.tbl(c1, c2);  

工具

理论上的理解还不够, 现实的问题需要显示来解决, 所以在每次使用sql前, 可以用explain的看下使用的所以是不是我们所期望的, explain只能用于select语句.非select语句,比如update和delete, 我们可以把where语句后的条件放入select进行explain.


尝试Tmux


Posted on July 19th 2014, 19:41


如果不是无鼠标操作控就可以忽略这篇文章了.很高兴你也是个无鼠标操作控, 今天就来看看tmux的神奇魔力.

现状

在介绍tmux之前,还是先来说说场景--当我们需要开起多个ssh来观察不同服务器的状态的时候,很多个terminal将不得不被打开,如果你是window,那么你要很辛苦的拖动个个框保持满屏,或者也可以使用第三方的tab功能,而如果你是linux,我恐怕你也不得不这么做.当然如果你是利用类似xmonad等的titling的窗口管理器,这也是可以得到解决的.
目前,本人也是利用xmonad和urxvt来达到这个效果, 使用久了也会觉得这样是如此烦,每次想要在terminal里面干点别的事情就不得不打开新的terminal.

tmux--爽

首先, 我们需要确定的事情是tmux不是terminal!!!它只是terminal的管理器,更准确的说是terminal复用器.
有什么直接的好处呢?Tmux可以帮助我们解决在只打开一个terminal的时候,既可以管理多个ssh,还可以管理多个vi或者top.或许你会问,这个功能通过后台进程不是可以搞定么?回答是是的,但是tmux do better.

tmux概念

在使用tmux之前,我们需要理解tmux中的四个概念client,session,window,pane.

client

client指的是我们的terminal,也就是能直接和session打交道的部分.

session

session则是进程的集合,也就是我们所说的多个ssh或者vi.

window

window是session的具体展现,可以理解为我们能看到的session.

pane

pane是把window切割成多个部分,也就是说我们可以在一个window中看到多个ssh.

使用后感受

使用了tmux大概有3天, 总体感觉得心应手, 特别是session的概念, 让多个程序管理起来有序,清晰, 非常使用.
下面罗列下常用的组合(所有组合都是默认的均未特别设置过):

  1. ctrl+b + [, 进入scroll模式, 默认用emacs的按键来移动, 也可配置成vi的模式
  2. ctrl+b + [ 进入scroll模式后科使用space进入复制选择模式, 然后用enter复制选中的文本
  3. ctrl+b + :, 进入tmux的命令行, 比如可以重开session, killsession等
  4. ctrl+b + %, 新建pane并按垂直分割, ctrl+b + %, 水平新建pane
  5. ctrl+b + s, 查看所有session
  6. ctrl+b + ?, 查看按键绑定

MQ的尝试


Posted on May 15th 2014, 19:14


long long ago, 就听说过Message Queue(mq), 一直没去尝试, 毕竟用到这种工具的都是分布式的场景了. 这次碰到一个很适合的场景决定适用一把mq.

场景

这次的场景需要由一个总控端将特定的任务分配给执行段, 当执行端完成作业后, 将这个任务从总控端中剔除.这个分配的动作则是由执行端主动去总控端获取.
所以我把这个场景设计为三个部分:

  1. 总控端, 负责生成任务并插入mq, 并监测mq的长度, 保证适度的长度
  2. 执行端, 负责从mq中获取任务并执行, 当任务失败或者程序崩溃的时候, 刚才获取的任务则重新回归总控端, 交给其他执行端执行, 保证任务一定被完整的执行.
  3. mq, 负责任务必须被一个执行端完整的执行

选择MQ

从google搜索, 可以有很多mq, 比如RabbitMQ, ActiveMQ, MSMQ, ZeroMQ等等, 一时间还比较难选择.
首先可以从google搜索结果的排名上排除几个, 剩下RabbitMQ和ActiveMQ.然后下载build文件的时候, RabbitMQ只要4M左右的大小而ActiveMQ则要40M, 对于没有耐性的我果断选择了RabbitMQ.
再细看RabbitMQ的文档, 它是用erlang写的--看过一篇文章, 这门语言是Ericsson为了通信行业写的, 所以对于他的可靠性和高效比较认可.最后看看他是不是支持业务场景--RabbitMQ支持message的ack模式, 也就是说receiver可以先获取message, 然后再任务处理完后, 确认这个message被消耗.
这下完美了, 可以开始动工了.

安装和体验

对于第一次上手RabbitMQ, 过程还是比较顺利的.在Gentoo和Centos下只需要1分钟的时间就安装完毕了.
再看配置文件, RabbitMQ的配置文件就是一个erlang的item, 格式如下

[ {app, {key, value}}, .. ]  

RabbitMQ基本不需要过多的配置, 采用默认的也可以, 非常方便.

问题

在开发过程中, 遇到了一个比较蛋疼的问题. RabbitMQ对于链接有一个heartbeat机制, 也就是说, 当接收不到这个heartbeat的时候, 链接就会自动断开, message就重新被分配. 由于任务处理的时候比较长, 所以经常碰到任务处理完后, 链接已经断开, 无法ack这个message.
而这个heartbeat可以在两个地方设置, 一个是server段的config文件, 一个是client段的参数.经过几次实验后, server段的配置优于client的参数, 也就是说当server配置为30s的时候, client即使配置成31s, 也会被重置为30s.

惊喜

RabbitMQ还提供了很多plugin, 方便管理和获取更多的特性.这里就尝试了一个管理的plugin, 它自动生成一个webui的界面, 让mq的状态--队列长度, 队列连接数等等的信息一目了然.


Haskell学习笔记- Monad, IO和Functor


Posted on March 16th 2014, 09:24


Monad这个概念是第一次在Haskell中看到, 也是haskell中比较难理解的部分之一, 但同样也是很重要的部分. 今天就来看看Monad到底是什么货, 同时也来看看Functor和IO是什么?

Monad用法

在给Monad一个正式的定义之前, 先来看看Monad的标准用法:

let a = Just 1 in a >>= \x -> Just (x+2) --output Just 2

这里我们先来回顾下lambda的用法:

\x -> Just (x+2)

这个函数将输入的x加2后返回, 并且把这个值包装在Just中.

对了, 这就是Monad的标准用法, 很直观的一个好处: 让代码更加的可读和简洁. 虽然我们不知道Just的实现, 但是我们可以猜到>>=可以将Just中的东西提取出来.

Read More


Haskell学习笔记--Typeclass


Posted on February 10th 2014, 20:08


新的一年新的开始. 技术还是要连续, 继续我的haskell旅行. 今天要看看haskell中异常强大的TypeClass, type和class放在一起, 会有怎样的化学反应呢?

首先来了解这么一个事实--Haskell中语言中没有对所有类型定义==操作符. 回想下其他语言, 比如c, ==的意义是对比两个内存位置, python中则是根据不同类型对比他们的内容.那么haskell为什么没有默认的实现, 它又是怎么实现的呢?

在Haskell中, 所有操作符, 比如+, =, .等, 都是函数, 我想这也可能是他是最纯粹的函数语言的原因之一. 所以这些操作符都是由用户实现的, 而实现他们的正是标准库Prelude. 貌似扯远了, 再回到Typeclass. Haskell就是通过Typeclass从而实现了, 操作符对不同类型的支持.


Read More


博客搜索