当前位置:  数据库>其它
本页文章导读:
    ▪Redis系列-主从复制配置      redis虽然有着卓越的性能,但我们仍然可以通过master/slave这种简单架构,进行读写分离,进一步挖掘redis的性能,提高系统的可用性。 redis怎么进行主从复制呢?redis复制主要是通过master server.........
    ▪MySQL索引与查询优化      概述              企业应用软件中,在数据存储方面选择为DBMS(数据库管理系统)。当数据量增多后,对数据的查询和分析在速度上会有很大的影.........
    ▪INDEX受到NULL值的影响      假设现在有如下一张表: CREATE TABLE TBL(     USERID NUMBER(20),     NAME VARCHAR2(20),     DEPTNO NUMBER(20) ) ; --模拟数据 BEGIN     FOR I IN 0..1000 LOOP         INSERT INTO .........

[1]Redis系列-主从复制配置
    来源: 互联网  发布时间: 2013-11-07

redis虽然有着卓越的性能,但我们仍然可以通过master/slave这种简单架构,进行读写分离,进一步挖掘redis的性能,提高系统的可用性。

redis怎么进行主从复制呢?redis复制主要是通过master server持久化的rdb文件实现的。master server 先dump出内存快照文件,然后将rdb文件传给slave server,slave server 根据rdb文件重建内存表。redis复制过程如下:

1、slave server启动连接到master server之后,salve server主动发送SYNC命令给master server

 2、master server接受SYNC命令之后,判断,是否有正在进行内存快照的子进程,如果有,则等待其结束,否则,fork一个子进程,子进程把内存数据保存为文件,并发送给slave server

3、master server子进程进程做数据快照时,父进程可以继续接收client端请求写数据,此时,父进程把新写入的数据放到待发送缓存队列中

4、slave server 接收内存快照文件之后,清空内存数据,根据接收的快照文件,重建内存表数据结构

5、master server把快照文件发送完毕之后,发送缓存队列中保存的子进程快照期间改变的数据给slave server,slave server做相同处理,保存数据一致性

6、master server 后续接收的数据,都会通过步骤1建立的连接,把数据发送到slave server

需要注意:slave server如果因为网络或其他原因断与master server的连接,当slave server重新连接时,需要重新获取master server的内存快照文件,slave server的数据会自动全部清空,然后再重新建立内存表,这样会让slave server 启动恢复服务比较慢,同时也给master server带来较大压力,可以看出redis的复制没有增量复制的概念,这是redis主从复制的一个主要弊端,在实际环境中,尽量规避中途增加从库。

通过上面的介绍,我们对redis的主从复制有了个大概了解,下面讲讲具体怎么配置master/slave。由于条件限制,这里用一台机器,启动两个进程来进行主从复制。 master server 配置文件master.conf, 主要配置如下:

daemonize yes
pidfile /var/run/redis_6379.pid
port 6379
#save 900 1
#save 300 10
#save 60 10000
dbfilename dump.rdb
dir /var/lib/redis/6379
slave server 配置文件slave.conf ,主要配置如下:

daemonize yes
pidfile /var/run/redis_6379.pid
port 6380
save 900 1
save 300 10
save 60 10000
dbfilename dump.rdb
dir /var/lib/redis/6380
slaveof 127.0.0.1 6379
slave.conf中,主要通过slaveof指定其master的ip和端口。启动master和slave:

/usr/local/bin/redis-server /etc/redis/master.conf
/usr/local/bin/redis-server /etc/redis/slave.conf
连接master server,写入数据:

[root@xsf001 ~]# redis-cli -p 6379
redis 127.0.0.1:6379> set user.1.name zhangsan
OK

连接 slave server,读数据:

[root@xsf001 ~]# redis-cli -p 6380
redis 127.0.0.1:6380> get user.1.name
"zhangsan"

从测试结果看,数据确实自动复制了。通过复制功能,我们可以在master上只写数据,在slave上读数据,关闭master的持久化(或aof)功能(在salve上开启),从而分担master服务器读压力,提高master服务器性能,同时,master挂了,可以快速地用slave server来替换master server,提高系统的可用性。

在实际环境中,我们可以根据redis复制特点,定制适合我们自己的复制架构。比如,采用master server ->slave server ->slave server ->slave server这种一拖一【或一拖一再拖多】的方式,和常规的一拖多方式相比,这种方式更能减少master server在复制数据时的压力。当然,由于redis复制的天然缺陷,我们也可以采用主动复制的方式【通过redis代理层,client在写master时,写多个master】来改造优化redis自带的复制策略,不过,主动复制,怎么保持数据的一致性也是个不小的挑战。

作者:love__coder 发表于2013-3-16 16:34:55 原文链接
阅读:0 评论:0 查看评论

    
[2]MySQL索引与查询优化
    来源: 互联网  发布时间: 2013-11-07

概述


             企业应用软件中,在数据存储方面选择为DBMS(数据库管理系统)。当数据量增多后,对数据的查询和分析在速度上会有很大的影响。原因如下:
        1、数据文件存储在磁盘上,每次读取会有I/O消耗。
        2、I/O性能始终是数据读取的瓶颈。数据随机存放,每一次的I/O操作消耗大量的CPU时间。为了降低I/O操作对DBMS查询速度的限制,DBMS引入了索引的概念。

       下面会以MySQL为例来说明,例子如下:
       假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储100条记录。如果没有索引,查询将对整个表进行扫描,最坏的情况下,如果所有数据页都不在内存,需要读取10^4个页面,如果这10^4个页面在磁盘上随机分布,需要进行10^4次I/O,假设磁盘每次I/O时间为10ms(忽略数据传输时间),则总共需要100s(但实际上要好很多很多)。如果对之建立B-Tree索引,则只需要进行log100(10^6)=3次页面读取,最坏情况下耗时30ms。这就是索引带来的效果,很多时候,当你的应用程序进行SQL查询速度很慢时,应该想想是否可以建索引。
 
索引

 

        索引类型


        MySQL的数据库引擎有两种,一是MyISAM另一种是INNODB。对于这两种的区别可以参看以下内容:
 http://www.cnblogs.com/villion/archive/2009/07/09/1893762.html。

        BTree是INNODB的索引算法,m阶的BTree树,满足如下内容
        1、所有节点最多有m个子节点
        2、根节点至少有两个子节点
        3、除根节点和叶子节点外,其它节点至少有m/2取上整个节点
        4、所有叶子节点在同一层
        5、有k个节点的非叶子节点恰好有k-1个关键字。
       其结构如下:


 

 

MySql执行计划


       使用explain关键字,通过该关键字可以查看mysql的执行计划。执行计划的参数如下:
 
 
查询优化经验


       (1)越小的数据类型通常更好:越小的数据类型通常在磁盘、内存和CPU缓存中都需要更少的空间,处理起来更快。


       (2)简单的数据类型更好:整型数据比起字符,处理开销更小,因为字符串的比较更复杂。在MySQL中,应该用内置的日期和时间数据类型,而不是用字符串来存储时间;以及用整型数据类型存储IP地址。


       (3)尽量避免NULL:应该指定列为NOT NULL,除非你想存储NULL。在MySQL中,含有空值的列很难进行查询优化,因为它们使得索引、索引的统计信息以及比较运算更加复杂。你应该用0、一个特殊的值或者一个空串代替空值。这个在实际开发中应该要注意到,避免出现空值。


      (4)如果对多列进行索引(组合索引),列的顺序非常重要,MySQL仅能对索引最左边的前缀进行有效的查找。

  例如:
  存在组合索引index_name(name,pwd),
 查询语句select * from t5 where name='1' and pwd='2'能够使用该索引。
 查询语句select * from t5 where name='1' 也能够使用该索引。
 但是,查询语句select * from t1 where pwd='2'不能够使用该索引,
 因为没有组合索引的引导列,即,要想使用pwd列进行查找,必需出现name等于某值。
 例子如下:mysql> desc t5;
 +---------+-------------+------+-----+---------+----------------+
 | Field   | Type        | Null | Key | Default | Extra          |
 +---------+-------------+------+-----+---------+----------------+
 | id      | int(11)     | NO   | PRI | NULL    | auto_increment |
 | name    | varchar(20) | NO   | MUL | NULL    |                |
 | pwd     | varchar(20) | NO   |     | NULL    |                |
 | sex     | int(11)     | YES  |     | 0       |                |
 | age     | int(11)     | YES  | MUL | 0       |                |
 | address | varchar(30) | YES  |     | NULL    |                |
 +---------+-------------+------+-----+---------+----------------+
 6 rows in set (0.01 sec)
 
 mysql> explain select * from t5 where name='n1'\G
 *************************** 1. row ***************************
      id: 1
   select_type: SIMPLE
   table: t5
    type: ref
 possible_keys: index_name
     key: index_name
    key_len: 62
     ref: const
    rows: 1
   Extra: Using where; Using index
 1 row in set (0.00 sec)
 
 
 mysql> explain select * from t5 where pwd='n1'\G
 *************************** 1. row ***************************
      id: 1
   select_type: SIMPLE
   table: t5
    type: index
 possible_keys: NULL
     key: index_name
    key_len: 124
     ref: NULL
    rows: 5
   Extra: Using where; Using index
 1 row in set (0.00 sec)

 

 mysql> explain select * from t5 where name='n1' and pwd='n1'\G
 *************************** 1. row ***************************
      id: 1
   select_type: SIMPLE
   table: t5
    type: ref
 possible_keys: index_name
     key: index_name
    key_len: 124
     ref: const,const
    rows: 1
   Extra: Using where; Using index
 1 row in set (0.00 sec)


     (5)like查询  mysql> explain select * from t5 where name like '%p1'\G
 *************************** 1. row ***************************
      id: 1
   select_type: SIMPLE
   table: t5
    type: ALL
 possible_keys: NULL
     key: NULL
    key_len: NULL
     ref: NULL
    rows: 5
   Extra: Using where
 1 row in set (0.00 sec)

 mysql> explain select * from t5 where name like 'p1%'\G
 *************************** 1. row ***************************
      id: 1
   select_type: SIMPLE
   table: t5
    type: range
 possible_keys: index_name
     key: index_nam

    
[3]INDEX受到NULL值的影响
    来源: 互联网  发布时间: 2013-11-07
假设现在有如下一张表:
CREATE TABLE TBL(
    USERID NUMBER(20),
    NAME VARCHAR2(20),
    DEPTNO NUMBER(20)
)
;
--模拟数据
BEGIN
    FOR I IN 0..1000 LOOP
        INSERT INTO TBL VALUES(
        I,CONCAT('TBL',I),MOD(I,2));
    END LOOP;
END;
/
SELECT * FROM TBL;
在这张表的数据上面建立了如下的索引:
CREATE INDEX INDEX_TBL_NAME_DEPTNO ON TBL(NAME,DEPTNO);
在这张表上,修改了name和deptno两列为not null:
alter table tbl modify(name not null);
alter table tbl modify(deptno not null);

我们在这张表上执行如下查询:
ChenZw> select name,deptno from tbl order by name,deptno;
已选择1001行。
已用时间:  00: 00: 00.03
执行计划
----------------------------------------------------------
Plan hash value: 2449324302
------------------------------------------------------------------------------------------
| Id  | Operation        | Name                  | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT |                       |  1001 |  8008 |     4   (0)| 00:00:01 |
|   1 |  INDEX FULL SCAN | INDEX_TBL_NAME_DEPTNO |  1001 |  8008 |     4   (0)| 00:00:01 |
------------------------------------------------------------------------------------------
我们看到,因为我们要查询的所有的数据都是在索引中可以提取,因此优化器选择了INDEX FULL SCAN的方式来获取数据,这里,如果没有排序操作的话,Oracle就会直接从索引中进行提取数据了,没有排序操作的INDEX FULL SCAN就是INDEX FAST FULL SCAN,如下面的执行计划:
ChenZw> select name,deptno from tbl;
已选择1001行。
已用时间:  00: 00: 00.03
执行计划
----------------------------------------------------------
Plan hash value: 3591538465
----------------------------------------------------------------------------------------------
| Id  | Operation            | Name                  | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |                       |  1001 |  8008 |     3   (0)| 00:00:01 |
|   1 |  INDEX FAST FULL SCAN| INDEX_TBL_NAME_DEPTNO |  1001 |  8008 |     3   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------
上面的结果就是没有排序,并且所有的数据都是可以直接从索引中获取的执行计划。

删除现在的表,然后再来一遍:
drop table tbl;

CREATE TABLE TBL(
    USERID NUMBER(20),
    NAME VARCHAR2(20),
    DEPTNO NUMBER(20)
)
;
--模拟数据
BEGIN
    FOR I IN 0..1000 LOOP
        INSERT INTO TBL VALUES(
        I,CONCAT('TBL',I),MOD(I,2));
    END LOOP;
END;
/
SELECT * FROM TBL;

CREATE INDEX INDEX_TBL_NAME_DEPTNO ON TBL(NAME,DEPTNO);

    
最新技术文章:
▪gc buffer busy/gcs log flush sync与log file sync    ▪让你的PL/SQL更好用    ▪ADO.NET中的非脱机数据库查询
▪参数job_queue_processes与Oracle jobs    ▪11gR2游标共享新特性带来的一些问题以及_cursor...    ▪_library_cache_advice和latch:shared pool、latch:shared poo...
▪SQL: Date Utility    ▪DB2 分区表增加分区    ▪DB2第一步 — 创建表
▪oracle 数据库    ▪插入10万条记录测试    ▪rebuild index VS. rebuild index online
▪如何处理undo tablespace 表空间太大的问题    ▪ado执行存储过程中包含结果集获取输出参数为...    ▪oracle函数的demo
▪Entity Framework 学习建议及自学资源    ▪存储过程的编写    ▪Linux/Unix shell 自动发送AWR report(二)
▪第二章 Oracle恢复内部原理(基础数据结构)    ▪Redis源码学习之【Tcp Socket封装】    ▪Java Jdbc减少与Oracle之间交互提升批量处理性能...
▪南大通用GBase8a Vs Oracle11g 单机测试亲测    ▪oracle 中行列转换    ▪rhel下安装oracle10g+asm---测试环境搭建
▪Redis系列-主从复制配置    ▪MySQL索引与查询优化    ▪INDEX受到NULL值的影响
▪测试人员的SQL语言 系列    ▪SQL数据库基本语句    ▪MySQL Replication常见错误整理[持续更新...]
▪eclipse下建立esper的demo    ▪把oracle rac 转化为单机数据库    ▪Redis系列-存储篇sorted set主要操作函数小结
▪基本的SQL*Plus报表和命令    ▪druid简单教程    ▪11g调度--scheduler使用
▪EF基础一    ▪db2存储过程中循环语句while do的continue有没有...    ▪oracle 创建DBLINK
▪DB2数据库备份还原    ▪Warning: prerequisite DBD::mysql 1 not found错误解决方...    ▪innotop性能监视mysql,innodb工具
▪数据迁移:DataGuard配置    ▪QX项目实战-19.跨库数据同步    ▪Mysql EXPLAIN
▪Oracle 11g AWR 系列七:Active Session History (ASH) 报...    ▪Oracle 11G新特性(共36个)    ▪父子节点问题
▪OEM简介及按钮乱码问题    ▪NoSql之MongoDB的常用类管理    ▪ORA-39700: database must be opened with UPGRADE option
▪node.js 访问redis数据库,pub/sub    ▪使用DBMS_REDEFINITION在线重定义分区表    ▪SQL Developer 使用问题与解决方法汇总
▪oralce 11g dataguard 概念    ▪ORA-30004 错误处理    ▪oracle分组函数rollup,cube
▪Sql Developer 使用问题与解决方法汇总    ▪Configure Oracle Dataguard Primary-ASM to Physical-ASM    ▪Oracle Data Guard 理论知识
▪Control File 恢复    ▪Oracle数据文件收缩    ▪Oracle 11g AWR 系列五:如何生成 AWR 报告?
▪Wireshark数据包分析实战(第2版)    ▪MySql用户权限控制    ▪db2和oracle查询序列区别
▪更新blob字段的存储过程    ▪MySQLReport分析报告三    ▪DB2中的序列
▪Oracle中DBMS_RANDOM.STRING 的用法    ▪SQL SERVER无法安装成功,sqlstp.log文件提示[未发...    ▪Data Guard 部署物理备库的 10 大注意事项
▪万能数据库查询分析器使用技巧之(九)    ▪SQL 自定义Split函数    ▪视图 v$sql,v$sqlarea,$sqltext,v$sqltext_with_newlines 的...
▪Data Guard Standby_archive_dest 和 Log_archive_dest_n 的...    ▪机房收费系统数据库设计(一)    ▪利用putty的SSH tunnel连接Oracle
▪DBCA建库偶遇ORA-27125    ▪使用PowerPivot建立简单的分析模型    ▪Linux/Unix shell 自动发送AWR report
▪写入到blob字段的存储过程    ▪关于JDBC中ResultSet接口的一点细节探究    ▪Data Guard 配置 Standby Redo Log
▪linux下redis的安装    ▪windows下redis的安装    ▪手动创建数据库步骤(简单翻译官方文档)
▪Ubuntu安装Mongodb    ▪SQL CLR应用    ▪redis的配置文件参数--详细说明
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3