让MySQL支持Emoji表情 mysql 5.5.3+

让mysql支持Emoji表情,涉及无线相关的 MySQL 数据库建议都提前采用 utf8mb4 字符集。 mysql 版本 5.6

1 解决方案:将Mysql的编码从utf8转换成utf8mb4。 需要 >= MySQL 5.5.3版本、从库也必须是5.5的了、低版本不支持这个字符集、 复制报错

2 my.cnf

文件添加

[mysqld]

character-set-server = utf8mb4

collation-server = utf8mb4_unicode_ci

init_connect=’SET NAMES utf8mb4′

3 修改需要添加库 表 字段的字符集

修改数据库字符集: ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

修改表的字符集: ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

修改字段的字符集: ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 如果只是某个字段需要 只需要修改那个字段的字符集就可以了

Read More →

1 基本场景
比如你有 N 个 cache 服务器(后面简称 cache ),那么如何将一个对象 object 映射到 N 个 cache 上呢,你很可能会采用类似下面的通用方法计算 object 的 hash 值,然后均匀的映射到到 N 个 cache ;

hash(object)%N

一切都运行正常,再考虑如下的两种情况;

1 一个 cache 服务器 m down 掉了(在实际应用中必须要考虑这种情况),这样所有映射到 cache m 的对象都会失效,怎么办,需要把 cache m 从 cache 中移除,这时候 cache 是 N-1 台,映射公式变成了 hash(object)%(N-1) ;

2 由于访问加重,需要添加 cache ,这时候 cache 是 N+1 台,映射公式变成了 hash(object)%(N+1) ;

1 和 2 意味着什么?这意味着突然之间几乎所有的 cache 都失效了。对于服务器而言,这是一场灾难,洪水般的访问都会直接冲向后台服务器;

再来考虑第三个问题,由于硬件能力越来越强,你可能想让后面添加的节点多做点活,显然上面的 hash 算法也做不到。

有什么方法可以改变这个状况呢,这就是 consistent hashing…

2 hash 算法和单调性
Hash 算法的一个衡量指标是单调性( Monotonicity ),定义如下:

单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中,又有新的缓冲加入到系统中。哈希的结果应能够保证原有已分配的内容可以被映射到新的缓冲中去,而不会被映射到旧的缓冲集合中的其他缓冲区。

容易看到,上面的简单 hash 算法 hash(object)%N 难以满足单调性要求。

3 consistent hashing 算法的原理
consistent hashing 是一种 hash 算法,简单的说,在移除 / 添加一个 cache 时,它能够尽可能小的改变已存在 key 映射关系,尽可能的满足单调性的要求。

下面就来按照 5 个步骤简单讲讲 consistent hashing 算法的基本原理。

3.1 环形hash 空间
考虑通常的 hash 算法都是将 value 映射到一个 32 为的 key 值,也即是 0~2^32-1 次方的数值空间;我们可以将这个空间想象成一个首( 0 )尾( 2^32-1 )相接的圆环,如下面图 1 所示的那样。

Read More →

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

很多人第一反应是各种切分;我给的顺序是:
第一优化你的sql和索引;

第二加缓存,memcached,redis;

第三以上都做了后,还是慢,就做主从复制或主主复制,读写分离,可以在应用层做,效率高,也可以用三方工具,第三方工具推荐360的atlas,其它的要么效率不高,要么没人维护;

第四如果以上都做了还是慢,不要想着去做切分,mysql自带分区表,先试试这个,对你的应用是透明的,无需更改代码,但是sql语句是需要针对分区表做优化的,sql条件中要带上分区条件的列,从而使查询定位到少量的分区上,否则就会扫描全部分区,另外分区表还有一些坑,在这里就不多说了;

第五如果以上都做了,那就先做垂直拆分,其实就是根据你模块的耦合度,将一个大的系统分为多个小的系统,也就是分布式系统;

第六才是水平切分,针对数据量大的表,这一步最麻烦,最能考验技术水平,要选择一个合理的sharding key,为了有好的查询效率,表结构也要改动,做一定的冗余,应用也要改,sql中尽量带sharding key,将数据定位到限定的表上去查,而不是扫描全部的表;

mysql数据库一般都是按照这个步骤去演化的,成本也是由低到高;

有人也许要说第一步优化sql和索引这还用说吗?的确,大家都知道,但是很多情况下,这一步做的并不到位,甚至有的只做了根据sql去建索引,根本没对sql优化(中枪了没?),除了最简单的增删改查外,想实现一个查询,可以写出很多种查询语句,不同的语句,根据你选择的引擎、表中数据的分布情况、索引情况、数据库优化策略、查询中的锁策略等因素,最终查询的效率相差很大;优化要从整体去考虑,有时你优化一条语句后,其它查询反而效率被降低了,所以要取一个平衡点;即使精通mysql的话,除了纯技术面优化,还要根据业务面去优化sql语句,这样才能达到最优效果;你敢说你的sql和索引已经是最优了吗?

再说一下不同引擎的优化,myisam读的效果好,写的效率差,这和它数据存储格式,索引的指针和锁的策略有关的,它的数据是顺序存储的(innodb数据存储方式是聚簇索引),他的索引btree上的节点是一个指向数据物理位置的指针,所以查找起来很快,(innodb索引节点存的则是数据的主键,所以需要根据主键二次查找);myisam锁是表锁,只有读读之间是并发的,写写之间和读写之间(读和插入之间是可以并发的,去设置concurrent_insert参数,定期执行表优化操作,更新操作就没有办法了)是串行的,所以写起来慢,并且默认的写优先级比读优先级高,高到写操作来了后,可以马上插入到读操作前面去,如果批量写,会导致读请求饿死,所以要设置读写优先级或设置多少写操作后执行读操作的策略;myisam不要使用查询时间太长的sql,如果策略使用不当,也会导致写饿死,所以尽量去拆分查询效率低的sql,

innodb一般都是行锁,这个一般指的是sql用到索引的时候,行锁是加在索引上的,不是加在数据记录上的,如果sql没有用到索引,仍然会锁定表,mysql的读写之间是可以并发的,普通的select是不需要锁的,当查询的记录遇到锁时,用的是一致性的非锁定快照读,也就是根据数据库隔离级别策略,会去读被锁定行的快照,其它更新或加锁读语句用的是当前读,读取原始行;因为普通读与写不冲突,所以innodb不会出现读写饿死的情况,又因为在使用索引的时候用的是行锁,锁的粒度小,竞争相同锁的情况就少,就增加了并发处理,所以并发读写的效率还是很优秀的,问题在于索引查询后的根据主键的二次查找导致效率低;

ps:很奇怪,为什innodb的索引叶子节点存的是主键而不是像mysism一样存数据的物理地址指针吗?如果存的是物理地址指针不就不需要二次查找了吗,这也是我开始的疑惑,根据mysism和innodb数据存储方式的差异去想,你就会明白了,我就不费口舌了!

所以innodb为了避免二次查找可以使用索引覆盖技术,无法使用索引覆盖的,再延伸一下就是基于索引覆盖实现延迟关联;不知道什么是索引覆盖的,建议你无论如何都要弄清楚它是怎么回事!

尽你所能去优化你的sql吧!说它成本低,却又是一项费时费力的活,需要在技术与业务都熟悉的情况下,用心去优化才能做到最优,优化后的效果也是立竿见影的!

转载 http://www.zhihu.com/question/19719997/answer/81930332

yaf没有自带的orm,所以必须自己集成orm。今天我就介绍自己喜欢的wedoo数据库操作类
目前使用的版本是0.9.8.3  yaf目录

1.修改public/index.php,在第一句写上

static $_db = NULL;//数据库静态变量

2.修改配置文件conf/application.ini

application.library = APP_PATH “/library”

;数据库加载
database.database_type = “mysql”
database.database_name = “yourdb”
database.server = “localhost”
database.username = “root”
database.password = “”
database.charset = “utf8”
database.port = 3306

数据库连接部分

3.修改library/medoo.php

use Yaf\Bootstrap_Abstract;
class medoo extends Bootstrap_Abstract
{
…. 省略
}

这里是继承Bootstrap_Abstract;

在构造方法中使用

public function __construct($options = null)
{
global $_db;//静态db
$dbConfig=\Yaf\Registry::get(“config”)->database->toarray();
$dbConfig[‘option’]=array(PDO::ATTR_CASE => PDO::CASE_NATURAL);
$options = $dbConfig;
。。。。省略N行
//以上是连接数据库的,这就是为什么要继承Bootstrap_Abstract的原因
//然后把$this->pdo = new PDO($dsn, $this->username, $this->password, $this->option);改成
if(!$_db){
$_db=$this->pdo = new PDO($dsn, $this->username, $this->password, $this->option);
}else{
$this->pdo=$_db;
}

}

配置完毕。这里解释一下为什么要用$_db。简单来说就是单例模式。

使用medoo类。我们可以在模型中这样用 Application/models/SampleModel.php

<?php
class SampleModel extends medoo{

private $_table=’mytable’;

public function show(){
$list=$this->select($this->_table,’*’, array(
‘LIMIT’=>5
));
return $list;
}
}

?>

在Application/controllers/Index.php 这样用
<?php
use Yaf\Controller_Abstract;
class IndexController extends Controller_Abstract {
public function indexAction(){
header(‘content-type:text/html;charset=utf-8’);
$model = new SampleModel();//第一次new
echo ‘<pre>’;
print_r($model->show());
echo ‘</pre>’;
$mo = new SampleModel();//第二次new
}
}
?>

用static $_db 实现单例模式,无论你new多少次模型,数据库只连接一次

求MYSQL中某字段内的重复数据,其中ziduan是表table中的字段,具体请自行替换

select ziduan,count(ziduan) from table group by ziduan having count(ziduan)>1

比如 user_name在user_table 中重复

select user_name,count(*) as count from user_table group by user_name having count>1;