邢栋博客

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

mysql常用存储引擎以及简单介绍
1.MyISAM
    特性
        并发性与锁级别
        表损坏修复
        check table tablename
        repair table tablename     
        MyISAM表支持的索引类型
        MyISAM表支持数据压缩
        命令行:myisampack //压缩就只能进行读操作
    使用场景
        非事务型应用
        只读类应用(支持压缩)
        空间类应用
2.Innodb
    特性
        事务型存储引擎
        完全支持事务的ACID特性
        Redo Log 和 Undo Log
        支持行级锁
            行级锁可最大程度的支持并发
            行级锁是有存储引擎层实现的
3.csv
    特点
        以CSV格式进行数据存储
        所有列必须都是不能为null的
        不支持索引
        可以对数据文件直接编辑
    文件系统存储特点
        数据以文本方法存储在文件中
        .csv文件存储表内容
        .csm文件存储表的元数据如表状态和数据量
        .frm文件存储表结构信息
    适用场景
        适合做为数据交换的中间表  电子表格-》CSV文件 -》mysql数据目录
4.Archive 
    文件系统存储特点
        以ZLIB对表数据进行压缩,磁盘I/O更少
        数据存储在ARZ为后缀的文件中
    特点
        只支持select 和insert操作
        只支持在自增id上建立索引
    使用场景
        日志和数据采集类应用
5.Memory
    文件系统存储特点
        也称HEAP存储引擎,所以数据保存在内存中,只有.frm文件
    功能特点
        支持hash索引(等值查找)和Btree索引(范围查找)
        所有字段都为固定长度 varchar(10) = char(10)
        不支持BLOG和TEXT等大字段
        使用表级锁
        最大大小是由max_heap_table_size参数决定
        create index idx_c1 on mymemory(c1);
        create index idx_c2 using  btree on mymemory(c2);
    使用场景
        用于查找或者是映射表,例如邮编和地区的对应表
        用于保存数据分析中产生的中间表
        用户缓存周期性聚合数据的结果表
6.Federated
    特点
        提供了访问远程Mysql服务器上表的方法
        本地不存储数据,数据全部放到远程服务器上
        本地需要保存表结构和远程服务器的连接信息
    如何使用
        默认禁止,启用需要在启动时增加federated参数
        mysql://user_name[:password]@host_name[:port_num]/db_name/tbl_name
    使用场景
        偶尔的统计分析与手工查询
常用sql语句整理

增加一张表
CREATE TABLE `table_name`(
...
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

增加记录
INSERT INTO `your_table_name`(`column_name`)
VALUES
('your_value_one'),
('your_value_two');

增加字段
ALTER TABLE `your_table_name`
ADD `your_column_name` ...
AFTER `column_name`;

增加索引
主键
ALTER TABLE `your_table_name`
ADD PRIMARY KEY your_index_name(your_column_name);

唯一索引
ALTER TABLE `your_table_name`
ADD UNIQUE your_index_name(your_column_name);

普通索引
ALTER TABLE `your_table_name`
ADD INDEX your_index_name(your_column_name);

全文索引
ALTER TABLE `your_table_name`
ADD FULLTEXT your_index_name(your_column_name);


逐行删除
DELETE FORM `table_name`
WHERE ...;
清空整张表
TRUNCATE TABLE `your_table_name`;

删除表
DROP TABLE `your_table_name`;

删除字段
ALTER TABLE `your_table_name`
DROP `column_name`;

删除索引
ALTER TABLE `your_table_name`
DROP INDEX your_index_name(your_column_name);


变更数据
UPDATE `table_name`
SET column_name=your_value
WHERE ...;

变更字段
ALTER TABLE `your_table_name`
CHANGE `your_column_name` `your_column_name` ...(变更);

变更字段值为另一张表的某个值
UPDATE `your_table_name`
AS a
JOIN `your_another_table_name`
AS b
SET a.column = b.another_column
WHERE a.id = b.a_id...;


普通查询
SELECT `column_name_one`, `column_name_two`
FROM `table_name`;

关联查询
SELECT *
FROM `your_table_name`
AS a
JOIN `your_anther_table_name`
AS b
WHERE a.column_name = b.column_name...;

合计函数条件查询:WHERE 关键字无法与合计函数一起使用
SELECT aggregate_function(column_name)
FROM your_table_name
GROUP BY column_name
HAVING aggregate_function(column_name)...;

同一个实例下跨库查询
SELECT *
FROM database_name.your_table_name
AS a
JOIN anther_database_name.your_anther_table_name
AS b
WHERE a.column_name = b.column_name...;

复制一张表结构
CREATE `your_table_name`
LIKE `destination_table_name`;

完全复制一张表:表结构+全部数据
CREATE `your_table_name`
LIKE `destination_table_name`;
INSERT INTO `your_table_name`
SELECT *
FROM `destination_table_name`;

附录:mysql常用命令
登陆: mysql -h host -u username -p
列出数据库:SHOW DATABESES;
列出表:SHOW TABLES;
表结构:DESC table_name;
使用一个数据库:USE database_name;
导入:source 'file';
导出:mysqldump -h 127.0.0.1 -u root -p "database_name" "table_name" --where="condition" > file_name.sql;
redis查看当前redis-server启动使用的配置文件

redis查看当前redis-server启动使用的配置文件


redis-cli info | grep config 

mongo提示Cannot natively represent the long 1476355233494 on this platform
今天用rockmongo打开一个集合的时候提示

Cannot natively represent the long 1476355233494 on this platform

解决办法

在index.php中加入
ini_set('mongo.long_as_object', 1);
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.
mongodb添加用户报错TypeError:db.addUser is not a function

db.addUser('admin','admin123')

出现

2016-08-11T12:22:00.498+0800 E QUERY    [thread1] TypeError: db.addUser is not a function :

原因 新版的mongodb已经不支持addUser方法了。

db.createUser({user:'admin',pwd:'admin123',roles:['userAdminAnyDatabase']})


优惠券
最新微语