邢栋博客

邢栋博客,Action博客,记录工作和生活中的点点滴滴

mysql事务隔离级别
mysql事务隔离级别

1 READ UNCOMMITTED 未提交读
在此级别,事务的修改,即使没有提交,对其他事务也是可见的。事务可以读取未提交的数据,这也被称为脏读。

2 READ COMMITTED 提交读
大多数数据库系统的默认隔离级别是这个,但是mysql不是。此级别满足 隔离性的简单定义:一个事务开始时,只能看见已经提交的事务所做的修改。换句话说,一个事务从开始知道提交之前,所做的任何修改对其他事务都是不可见的。这个级别有时候会出现不可重复读,因为两次执行同样的查询,可能会得到不一样的结果。

3 REFEATABLE READ 可重复读
解决了脏读的问题。该级别保证了在同意事务众多次读取同样记录的结果时一致的。但是理论上,可重复读隔离级别还是无法解决另外一个幻读的问题。所谓幻读,指的是当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行。此级别是mysql的默认事务隔离级别。

4 SERIALZABLE 可串行化
此级别是最高的隔离级别。它通过强制事务串行执行,避免了前面说的幻读的问题。简单来说,此级别会在读取的每一行数据都加上锁,所有可能导致大量的超时和锁争用的问题。只有在非常需要确保数据的一致性而且可以接受没有并发的情况下,才考虑用该级别。

mysql大数据量分页查询优化
select * from table test limit 2500000,10;
QQ截图20161201201227.png

优化方法
1. select * from test where id >= (select id from test limit 2500000,1) limit 10;
QQ截图20161201201236.png
2. select * from test as a join (select id from test limit 2500000,10) as b on a.id=b.id;
QQ截图20161201201244.png

ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column
mysql> select * from user_gift where real_receive_user_id = 149 group by send_user_id;
ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'live.user_gift.u_g_id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
解决办法:
set @@sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
去掉ONLY_FULL_GROUP_BY即可正常执行sql.
brew安装mysql出现Error: Operation already in progress for mysql

mac环境下,我使用brew安装mysql,过程中,我终止安装,当在安装的时候出现Error: Operation already in progress for mysql

解决办法

执行jobs命令,查看后台运行的任务,执行kill %你的任务序号,如果 kill %2


mysql数据类型及其大小限制
mysql数据类型及其大小限制

数字类型
INT 正常大小的整数,可以有符号,也可以没有符号。如果是有符号整数,其允许的取值范围是-2147483648~2147483647;无符号整数的取值范围是从0至4294967295。最高可指定11位数字。
TINYINT非常小的整数,分为有无符号两种。前有符号时,其允许取值范围是-128~127;无符号时的取值范围为0~255。所以,最高可指定4位数字。
SMALLINT较小的整数,分为有无符号两种。前有符号时,其允许取值范围是-32768~32767;无符号时的取值范围为0~65535。所以最高可指定5位数字。
MEDIUMINT 中型大小的整数,分为有无符号两种。前有符号时,其允许取值范围是-8388608~8388607;无符号时的取值范围为0~16777215。所以,最高可指定9位数字。
BIGINT 较大型的整数,分为有无符号两种。前有符号时,其允许取值范围为-9223372036854775808~9223372036854775807;无符号时的取值范围为0~18446744073709551615。最高可指定20位数字。
FLOAT(M,D) 不带符号的浮点数。M 代表显示长度,D 代表小数位数。这两个参数都不是必需参数,它们默认为10, 2,表示小数点后有2位数字,而整个数字的位数为10(包含小数位数)。FLOAT 类型的小数精度可以达到24位。
DOUBLE(M,D) 不带符号的双精度浮点数。M 代表显示长度,D 代表小数位数。这两个参数都不是必需参数,它们默认为16, 4,表示小数点后有4位数字,而整个数字的位数为 16(包含小数位数)。DOUBLE 类型的小数精度可以达到53位。DOUBLE 与 REAL 同义。

DECIMAL(M,D) 非压缩的无符号浮点数。 在未压缩十进制中,每一位十进制数都对应一个字节。需要定义显示长度(M)和小数位数(D)。DECIMAL 与 NUMERIC 同义。

日期与时间类型
MySQL 包含以下几种日期与时间类型:
DATE YYYY-MM-DD (年-月-日)格式显示的日期,取值范围从1000-01-01 到 9999-12-31。比如1973年的12月30日就存为 1973-12-30。
DATETIME 按照 YYYY-MM-DD HH:MM:SS 格式组合显示的日期与时间,取值范围从1000-01-01 00:00:00 到 9999-12-31 23:59:59。比如说1973年的12月30日下午3 : 30就存为1973-12-30 15 : 30 : 00。
TIMESTAMP 介于1970年1月1日凌晨与2037年某个时间点之间的一种时间戳。这种格式与之前的 DATETIME 格式相仿,只不过少了数字间的连字符。1973年12月30日下午3 : 30被存为19731230153000(YYYYMMDDHHMMSS)。
TIME 按照 HH:MM:SS 格式存储的时间。
YEAR(M) 用2位或4位格式存储的时间。如果把长度定为2,比如说YEAR(2),那么可以表示从1970年到2069年的这些年份(70-69)。如果把长度定为4,YEAR(4),则可以表示从1901年到2155年。默认长度为4。

字符串类型
虽然数字与日期类型都很有趣,但通常我们存储最多的就是字符串了。下面列出了 MySQL 中常见的字符串类型。

CHAR(M) 长度固定的字符串,长度范围从1~255个字符,比如CHAR(5)。在存储时,会向右用空格补齐指定长度。长度并非必须参数,默认长度为1。
VARCHAR(M) 长度不定的字符串,长度范围从1~255个字符。比如:CHAR(25)。在创建VARCHAR字段时,必须定义长度。
BLOB or TEXT 最大长度为65535个字符的字段。BLOB是Binary Large Objects(二进制大型对象)的缩写,专用于保存大量的二进制数据,比如图片或其他类型的文件。TEXT 类型的文件也能保存大型数据。这两者的区别在于存储数据的排序和对比方面,BLOB类型数据是大小写敏感的,而TEXT类型数据则不是。另外,不能指定它们的长度。
TINYBLOB or TINYTEXT 最大长度为255个字符的 BLOB 或 TEXT 字段。同样也不能指定它们的长度。
MEDIUMBLOB or MEDIUMTEXT 最大长度为16777215个字符的 BLOB 或 TEXT 字段。同样也不能指定它们的长度。
LONGBLOB or LONGTEXT 最大长度为4294967295个字符的 BLOB 或 TEXT 字段。同样也不能指定它们的长度。
ENUM 枚举类型,是一种很独特的列表类型。ENUM 类型的数据实际是一个包含多个固定值的列表,只能选择这些值(包括 NULL 值)。例如,如果希望某个字段包含 "A"、"B" 和 "C",必须这样定义:ENUM ('A', 'B', 'C'),只有这些值(或 NULL 值)能够填充到该字段中。
mysql5.6太占内存了

刚在阿里云买的服务器,512内存的,装上mysql5.6,就这样了,哎

QQ截图20151009093717.png

mysql order by varchar类型字段 排序
今天写一个sql语句 最后 order by fld_sort;
出来的顺序竟然是 1,11,2
看下原来fld_sort的字段竟然是 varchar类型
最后写成 order by fld_sort+0; 可以解决
不过感觉如果单独对列表进行排序,排序的字段最好是 写成 int 类型
thinkphp3.2同时支持mysql和mongodb

1.如果只是支持mysql,就不用说了,先说说只支持mongodb吧

在config.php中

<?php
return array(
//'配置项'=>'配置值'
'DB_TYPE'=>'mongo',
'DB_HOST'=> '127.0.0.1', 
'DB_USER'=>'',      
'DB_PWD'=>'',        
'DB_PORT'=>'27017',
'DB_NAME'=> 'test',     
 'DB_PREFIX'=> '',

);

新建一个TestModel.class.php文件

<?php
namespace Home\Model;
use Think\Model\MongoModel;
Class TestModel extends MongoModel{

}
?>

然后在控制器中 

$user =  D("users")->select();

var_dump($user);

就可以了。


2.同时支持mysql和mongodb

测试后发现只能以mogodb为主是可以使用的。

在config.php配置文件中

<?php
return array(
//'配置项'=>'配置值'
'DB_TYPE'=>'mongo',
'DB_HOST'=> '127.0.0.1', 
'DB_USER'=>'',      
'DB_PWD'=>'',        
'DB_PORT'=>'27017',
'DB_NAME'=> 'test',     
 'DB_PREFIX'=> '',

'DB_MYSQL' => array(
'DB_TYPE' => 'mysql', // 数据库类型
'DB_HOST' => 'localhost', // 服务器地址
'DB_NAME' => 'test, // 数据库名
'DB_USER' => 'root', // 用户名
'DB_PWD' => '1314', // 密码
'DB_PORT' => 3306, // 端口
'DB_PREFIX' => 'action_' // 数据库表前缀
),

);


然后mongodb的调用方法不变,mysql调用方法

mysql的可以这样:
$user = M('user','action_','DB_MYSQL')->select();
var_dump($user):


手册介绍地址:http://document.thinkphp.cn/manual_3_2.html#connect_db


优惠券
广告位-淘宝
最新微语