Myisam-存储引擎-MYI索引文件-2
进一步一剖析MYI索引文件的树形结构存储以及索引块的定位[@more@]1. 绪我们在上一节<Myisam-存储引擎-MYI索引文件-1>中,仔细地探讨了索引文件的结构以及各位的含义.从而让我们了解了MYI. 但是用的例子由于行数比较少, 所有KEY VALUE都存储到了ROOT块. 没有出现多层的索引树结构. 通过这个例子,我们来了解一下,当有索引树出现多层的时候,MYSQL是怎么处理的.2. 创建脚本:drop table if exists heyf ;create table heyf (id char(5)) type myisam DEFAULT CHARSET=latin1;drop procedure if exists proc1;delimiter $$create procedur
Myisam 存储引擎-MYI索引文件-1
深入挖握MYI索引文件的具体存储,以及定位数据文件的方法[@more@]-- Myisam 存储引擎的索引文件.MYI -11. 介绍.MYI文件是MYISAM表的索引文件,它一般与.MYD文件同时创建,并存放在相同的目录中,..MYI索引文件主要包括两个部分: The header information and The key values. 下面我们将从这两个部分介绍索引文件.2. The .MYI Header ".MYI Header "主要包括以下几块内容:Section Occurrences------- -----------state Occurs 1 timebase Occurs 1 timekeydef (including keysegs) Occurs once for each keyrecinfo Occurs once for
MYSQL-数据类型存储-DATE
MYSQL-数据类型存储-DATE on Engine of myisam[@more@]1. 环境版本: OS : LINUX AS4 MYSQL: 5.0.51a-logENGINE : Myisam DEFAULT CHARSET=latin12. 分析date 类型共占3个字节(24位),范围'1000-01-01'到'9999-12-31' , 格式'YYYY-MM-DD' ,其中:从左到右数1~15位: 存储年(共15位)16~19位: 存储月(共4位)20~24位: 存储日(共5位)比如," 2009-03-09",其中:十进制 十六进制 二进制-----------------------------------2009 -> 0X7D9 -> 000 0111 1101 100103 -> 0X03 -> 001109 -> 0X09 -> 01001-----------------
MYsql-存储过程-游标的嵌套
在ITPUB: http://www.itpub.net/viewthread.php?tid=1134085&pid=13049789&page=1&extra=#pid13049789上有人发贴说游标不能嵌套,自己搞了一下,答案确实是..[@more@]create table heyf_6 (empid int , deptid int );insert into heyf_6 values (1,20),(2,30),(5,20),(4,50),(6,20);--按DEPTID从小到大打印各个部分里的EMPIDDROP PROCEDURE IF EXISTS proc_empid;DELIMITER //CREATE PROCEDURE proc_empid()BEGINdeclare done int default 0;declare v_dept int ; declare cur_dept cursor For select distinct deptid from
Myisam 静态格式数据存储结构
Myisam 静态格式 数据的物理存储 行header 内部分析[@more@]1. 从简单的例子开始1.1 创建测试数据drop table if exists heyf_5 ;create table heyf_5 (id int , name char(10),addr char(20)) engine myisam DEFAULT CHARSET=latin1;insert into heyf_5 values (12,'hyf','street-1') ,(13,'steven','street-2') ; system hexdump /opt/mysql/data/test/heyf_5.MYD------------------------------------------------0000000 0cf1 0000 6800 6679 2020 2020 2020 73200000010 7274 6565 2d74 2031 2020 2020 2020 20200000020 2020 f120 0
MYSQL-实现ORACLE- row_number() over(partition by ) 分组排序功能.
由于MYSQL没有提供类似ORACLE中OVER()这样丰富的分析函数. 所以在MYSQL里需要实现这样的功能,我们只能用一些灵活的办法:[@more@]1.首先我们来创建实例数据:drop table if exists heyf_t10;create table heyf_t10 (empid int ,deptid int ,salary decimal(10,2) ); insert into heyf_t10 values (1,10,5500.00),(2,10,4500.00),(3,20,1900.00),(4,20,4800.00),(5,40,6500.00),(6,40,14500.00),(7,40,44500.00),(8,50,6500.00),(9,50,7500.00);2. 确定需求: 根据部门来分组,显示各员工在部门里按薪水排名名次.显示结果预期如下:+-------+---
Oracle 行列转换小结
字符串-->多行多行--> 字符串[@more@] 多行-->字符串-- 建立测试数据drop table heyf_t8;create table heyf_t8 ( APP_ID VARCHAR2(20) , APP_CATEGORY_ID VARCHAR2(20) ); insert into heyf_t8 values ('1','A');insert into heyf_t8 values ('1','b');insert into heyf_t8 values ('1','c');insert into heyf_t8 values ('2','sdf');insert into heyf_t8 values ('2','B');insert into heyf_t8 values ('2','C');insert into heyf_t8 values ('2','C');insert into h
mysql开发-动态语句编写-引号使用
我们在写MYSQL存储过程的动态SQL时, 往往是先写好SQL原型,再根据需要来写成动态的形式.但往往这个过程是非常痛苦的,因为在这中间你可以需要处理很多个单引号及一些特殊字符.[@more@]我们在写MYSQL存储过程的动态SQL时, 往往是先写好SQL原型,再根据需要来写成动态的形式.但往往这个过程是非常痛苦的,因为在这中间你可以需要处理很多个单引号及一些特殊字符.(如果你写过ORACLE PL/SQL就会有相会的经验).不过呢,非常幸运的是,在MYSQL中支持双引号". 也就是说你基本不去改SQL原型,MYSQL会原样搬过来.比如,我们要的SQL原型如下: select *
SQL优化-关于ORDERED-HASH中错误选择连接字段对性能的影响
关于ORDERED-HASH中错误选择连接字段对性能的影响[@more@]在BOSS项目的优化过程中,遇到了这么一个情况:SELECT">heyf@VOUCHER>SELECT /*+ ordered use_hash(c t cr con ) */ count( distinct c.customer_id) FROM crm_customer c, (select t.customer_id,max(t.gmt_train) gmt_train from crm_train_record t where t.gmt_train >= to_date('2008-02-01', 'yyyy-MM-dd') - 5 and t.gmt_train < to_date('2009-02-26','yyyy-MM-dd')+
关于java处理不同数据库字符集的数据同步
两个数据库字符集不一样,如何快速增量同步数据.[@more@]环境: DB-A 字符集:US7ASCII DB-B 字符集:ZHS16GBK 需求: 从DB-A中将一个表的中文数据通过JAVA定时任务同步到DB-B. DB-A库中表的信息如下: CREATE TABLE USER_INFO (USER_ID number, USER_NAME varchar2(50)); 如果用一般的方式来SELECT,和INSERT,不管客户端用什么样的字符集,数据到DB-B上肯定会显示乱码. 解决方法1 (在数据库实现) 解决思路:通过视图将数据转换成二进制数据,绕过字符集的转换,然后让目标库来读取. 1. 在DB-A库上创建视图:
PLSQL不规范的参数命名导致的问题
PLSQL代码编写过程中,对标识符的命名一定要规范,不然会引发一些非常莫名的问题...[@more@]我们先通过环境来引出问题:有一个PROCEDURE用来更新积分表. ****************************************************************************************************desc">heyf@VOUCHER>desc fi_bonus_user_amount; Name Type -------------------------- ------------------------------------ ID VARCHAR2(20) CORPORATION_ID
SELECT也需要COMMIT
SELECT (DBLINK) 需要 COMMIT来释放事务;[@more@]业务环境: A机器10.0.69.101 -- heyf B机器10.2.226.24 -- VOUCHER 有业务需求,B需要去连接A取数据,下面创建一个简单的环境. 在B机器上: TNSNAMES.ora heyf = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.69.101 )(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = heyf) ) ) create">heyf@VOUCHER>create database link a connect to heyf identifie
Oracle (block clean out) oracle的块清除
Clean out有2种: fast commit cleanout delayed block cleanout[@more@] 1,如果一个事务(transaction)修改不超过10%buffer cache的数据块时,oracle做的是fast commit cleanout。2,如果一个事务(transaction)修改的块超过10% buffer cache,那么"超过的块"就执行delayed block cleanout,3,在事务commit前,修改的数据块已经写入硬盘,当发生commit时,oracle并不会把block重新读入内存来做cleanout,这样成本太高. 而是把cleanout留到下一次对此块的访问(select,update)时完成。 下面我们来简单看一下这两种情况: -
SQL优化-COUNT_ INDEX的巧用
一个SQL COUNT 优化案例,作一个小结[@more@]SQL需求:在一个8000W的表中,找出修改时间为某一时间段的记录,并且某字段不为空:select count(*) from aliim.udb_user_profile a where a.gmt_modified >= to_date('2008-07-21 14:29:38', 'yyyy-mm-dd hh24:mi:ss') and a.gmt_modified <= to_date('2008-07-21 15:34:50', 'yyyy-mm-dd hh24:mi:ss') and a.AEP_USER_ID is not null首先想到的是在 gmt_modified 字段中创建单列索引,让查询走索引,并返回到表中过滤 a.AEP_USER_ID is not null.create index udb_user_profile_g
行的存储(块内连接与块外连接)
都说ORACLE一个行能存储1000个字段,本人在看CONCEPTS的时候发现这么一段:Oracle stores each row of a database table containing data for less than 256 columns as one or more row pieces.咋一眼看上去,以为CONCEPTS说只能存储256个字段。 再仔细看:[@more@]If an entire row can be inserted into a single data block,then Oracle stores the row as one row piece. However, if all of a row’s data cannot be inserted into a single data block or an update to an existing row causes the rowto outgrow its data block,
关于锁的快速定位
当我们在执行某个update,或delete的时候,发布自己的SQL等在那里,如何更快速地定位到问题源?[@more@]--------查看哪些对象被锁了!select t2.username, t2.sid, t2.serial#, t3.object_name, t2.OSUSER, t2.MACHINE, t2.PROGRAM from v$locked_object t1, v$session t2, dba_objects t3 where t1.session_id = t2.sid and t1.object_id = t3.object_id order by t2.logon_time;--------察看表锁(可以查看什么类型的锁)select /*+ rule */ s.sid sid,s.username username,s.machine machine,l.
SQL优化好助手:Runstats
在SQL优化的过程中,我们有时候需要比较两个SQL或者过程的性能.这里推荐一个工具:RUNSTATS包[@more@]这个包在使用前需要自己创建,脚本如下: conn / as sysdba; grant select on V_$STATNAME to &&USERNAME; grant select on V_$MYSTAT to &USERNAME; grant select on V_$TIMER to &USERNAME; grant select on V_$LATCH to &USERNAME; drop table run_stats; create global temporary table run_stats ( runid varchar2(15), name varchar2(80), value int ) on commit preserve rows;--create VIEWcr
oracle的正则表达式(regular expression)简单介绍
Oracle 10g正则表达式提高了SQL灵活性。有效的解决了数据有效性, 重复词的辨认, 无关的空白检测,或者分解多个正则组成的字符串等问题。[@more@]Oracle 10g支持正则表达式的四个新函数分别是:REGEXP_LIKE、REGEXP_INSTR、REGEXP_SUBSTR、和REGEXP_REPLACE。它们使用POSIX 正则表达式代替了老的百分号(%)和通配符(_)字符。特殊字符:'^' 匹配输入字符串的开始位置,在方括号表达式中使用,此时它表示不接受该字符集合。'$' 匹配输入字符串的结尾位置。如果设置了 Reg
执行计划大刚OUTLINE的管理
10G,LINUX as3[@more@]更改优化器 alter session set optimizer_boal=choose;--first_rows创建OUTLINE,看执行计划,如果计划合适,就为SQL创建OUTLINE create or replace outline myoutline for category mycategory on select empno ,ename from emp where empno>0; 或者 alter session set create_stored_outlines=true; alter session set create_stored_outlines=false; -----注意,以上两种方式产生的OUTLINE有区别: 用例子来说明。 <见CURSOR_CHARING=FORCE与大刚>让SESSION使用O
用SQLLOAD导入CLOB数据
10G,SUSE 9,SQLPLUS[@more@]1,创建表结构create table sqlload_test ( EMPNO number,ENAME varCHAR2(20),JOB varCHAR2(20),MGR number,SAL number,COMM number,DEPTNO number,resume clob)2,建立数据oracle@linux:~> cat > ulcase91.dat <<EOFResume for Mary ClarkCareer Objective: Manage a sales team with consistent record breakingperformance.Education: BA Business University of Iowa 1992Experience: 1992-1994 - Sales Support at MicroSales Inc.Won "Best Sales Support" award in 1993 and 199419