Database

mysql技巧杂烩 (一)

1. mysql控制台   a. "select * from t \c  " 里的 "\c" 告诉mysql忽略当前的语句   b. 也可以通过Tab键来补全表名、列名   c. 可以不进入mysql控制台,直接在shell状态下执行mysql语句, 如 mysql -e "select * from person" cookbook -u root -p ("cookbook"是数据库名)   d. 让查询结果分页:先执行\P /usr/bin/less, 再执行你的查询如 select * from person   e. “垂直”地输出结果(每列独占一行):select * from person \G 2. SQL 方言   a. 拼接函数: concat(c1, c2) …

mysql技巧杂烩 (一) Read More »

mysql技巧杂烩 (二)

mysql技巧杂烩 (二) 1. 日期与时间 a.若只存日期,则使用"date"类型;若只存时间,则使用"time"类型; 若要存日期+时间,则使用datetime类型(用timestamp也可以,但稍微复杂一些) a2.mysql的日期时间最多精确到“秒”级别 b.string -> date: select str_to_date(‘2012-02-28 18:23:30’, ‘%Y-%m-%d %T’); c. date  -> string: select date_format(now(), ‘%Y-%m-%d %T’); d. mysql还提供了很多强大的日期计算函数,此处不述 2. 元数据 a.查看元数据有两大工具:使用SHOW命令 或者 查询INFORMATION_SCHEMA库里的表 b.显示所有数据库:select schema_name from information_schema.schemata; 或 show databases; c.显示库里所有的表: select table_name from information_schema.tables where table_schema=’cookbook’; 或 show tables; d.显示表里所有的字段:    i. select * from information_schema.columns where table_schema=’cookbook’ …

mysql技巧杂烩 (二) Read More »

PreparedStatement: SQL的in字句后面的候选值的个数不定怎么办?

对这样一条SQL:    sql * from t where c in (?,? …?) 我们希望问号的个数是固定的,这样才能利用SQL预编译缓存,避免硬解析 但如果问号个数就是不固定的怎么办?     1.如果问号的最大个数是固定的,则总是使用最大个数的问号;当parameter数小于问号数时,用null补全     2.如果连最大个数都不是固定的,则要考虑使用数组类型了

允许传递依赖的一种情况

传递依赖违反了数据库设计范式,但有时允许传递依赖,可以获得比较好的直观性 比如, <公司,部门,员工>这种关系,可以设计两张表:     <company-id, department-id, employee-id> 和  <company-id, department-id> 是的,这样会有冗余:<公司,部门>关系在两张表里都存在。 这样会不会出问题? 如果一个部门永远跳不出它所属的公司,其实这种冗余就无所谓。否则,第二张表里的re-match会引发第一张表的批量改动。 那这样做又有什么好处?好处就是避免一次表连接。如果消除了传递依赖,那么查询员工所属部门时就得连接两张表: <company-id, department-id> 和 <department-id, employee-id>。 如果你的业务中,“部门”的概念非常弱,弱到只相当于一个标签的话,你就可以采取这种反范式的设计。 如果“部门”下面还分“子部门”,并且组织架构重整经常发生的话,那你还是不要这样玩了。老老实实按范式走,可以使编码更优雅更干净。

记住这个术语: ETL

记住这个术语,不要老记成DTL, DSL之类的 WIKI: ==================================================================== Extract, transform and load (ETL) is a process in database usage and especially in data warehousing that involves:     * Extracting data from outside sources     * Transforming it to fit operational needs (which can include quality levels)     * Loading it into the end target (database or data warehouse)

Oracle:字段顺序也会影响效率

摘自《Troubleshooting Oracle Performance》 Oracle从数据块中取某个字段的数据时,它需要知道这个字段在该行数据中所处的位置;而确定位置的方法很土: 要像知道第2个字段的位置,必须先知道第1个字段所占的长度,然而用这个偏移量去找第2个字段;同理,取第3个字段时,要先知道第2个字段的位置和长度。 所以说, 取越靠后的字段,效率就越低。 所以,越要频繁读取的字段,越应该放前面。

Oracle行预取

没有行预取时,数据是一条一条传到客户端的; 而有了行预取,比如10,则数据会按每次10条传给客户端。 这样做可以明显降低网络传输次数,提高效率。 Oracle Jdbc Driver 提供了行预取的设置:    connectionProperties.put("defaultRowPrefetch","1")

Oracle: 通过数组接口实现批量数据传输

摘自《Troubleshooting Oracle Performance》 如果要按相同的SQL插入一万条数据,一条一条插的效率是很低的;可以把所有数据组装成“数组”,然后只执行一次插入即可。 JDBC的batch update的实现其实就是利用了数据库的这种机制

Oracle: 索引与 … where a is null

摘自《Troubleshooting Oracle Performance》 假设 a 列上建了一条索引 1. 对于B-树索引    … where a is null 会导致全表扫描,因为B-树索引不存储NULL值    若a+b上有联合索引,则        … where a is null and b = xx 仍会使用索引 2.对于位图索引       … where a is null 仍然会使用索引,因为位图索引会存储NULL值