Database

mysql – 让in查询的结果按in参数列表排序

select * from t where id in (3,1,2) 结果可能是 1, xxx 2, xxx 3, xxx 或者其它,反正不确定 select * from t where id in (3,1,2) order by field(t.id 3, 1, 2) 就可以确定得到这样的排序结果 3, xxx 1, xxx 2, xxx 在ibatis里这样写: <select id="someSql" parameterClass="list" resultMap="resultMap"> select * from t where id in <iterate open="(" close=")" conjunction=","> #[]# </iterate> …

mysql – 让in查询的结果按in参数列表排序 Read More »

mysql – 只对一个字段做distinct

要在所有用户记录中做一次普通的查询,要求返回的结果中,对某一个“姓”只有一条记录。 比如,你的数据是这样 引用 ln  fn   陈  东 胡  西 陈  南 刘  北 我希望查出的是 引用 ln  fn 陈  东   // 或  “陈  南”,总之只返回一个姓陈的 胡  西 刘  北 sql要这样写: select * from user group by ln

逻辑删除一条记录时,最好删除相关的关系表中的记录

逻辑删除一条记录时,最好删除相关的关系表中的记录。 如果不这样做,会导致没必要的连接,在极端情况下会出现极其糟糕的性能。 今天就遇到这样一个实例。 有两个表,分别叫a表和b表,它们之间有一张a_b关系表, a可以逻辑删除。要查找b=123关联的前10个a记录,需要这样关联: select a.a_id from a_b join a on a_b.a_id = a.a_id where a_b.b_id = 123 and a.deleted = 0 order by a.a_id limit 0, 10 — a.deleted = 0 代表未删除 一般情况下,我们预期它会先根据a_b.b_id = 123找出相关的a_id,然后再根据a_id从a表中过滤中deleted = 0的记录。 然而今天发现一个奇怪的情况,如果b关联的a记录很多时,它会先按 deleted = 0扫描整个a表(deleted上有索引),然后再与a_b关联。性能极差。 数据的分布对执行计划的影响是很难捉摸的,最好的办法就是不做关联。 所以我们可以这样,当逻辑删除a记录时,清除a_b中的关系记录。这样就不用连接了: select a_b.a_id from a_b where a_b.b_id = 123 order by …

逻辑删除一条记录时,最好删除相关的关系表中的记录 Read More »

要不要做冗余字段?

冗余是为了避免join, 但避免join未必要一定冗余。你可以先把A关联的b_id查出来,然后再去B表里查一次。 那么什么情况下应该选择冗余,什么情况下选择查询两次呢?除了要看数据会不会更新,还有一些考虑因素:(大前提是不作join) 1. 如果只需要看A的单行记录,及这行记录对应的B记录,使用两次查询就够了 2. 如果需要查看A的列表,及对应的B记录,那就可以考虑把B记录冗余到A表,也可以不冗余。不冗余的话,就要收集A列表中所有的b_id,然后批量地去B表中执行in查询,稍微有点麻烦 3. 如果需要根据B表中的字段查询A记录,并带出相关的B记录,那就只能用冗余了。为了帮助理解,举个例子:在一个论坛系统的数据库中,找出这样一些“回复”记录,这些回复对应的主贴的作者以"k"开头且回复发表于三天之内,结果中除了要显示“回复”记录,还要显示主贴的作者。 如果“回复”表里没有冗余“主贴作者”字段,这个问题就无解。

mongodb + spring data一起使用时,bean的id应该用什么类型?

mongodb + spring data一起使用时,bean的id应该用什么类型? 在插入bean时我不会设置id的值,而是让mongodb/spring data把生成的_id塞进来。 用原子类型long, int 会有问题;不设置值时,值就是0, mongodb会认为你传的_id值为0. 第一条记录以_id=0插入成功后,插入第二条_id=0的记录时,系统会报键重复的异常。 用Long, Integer行不行? 也不行,因为Spring Data没有内置这样的转换。 正确答案是:String或BigInteger, Spring Data默认只支持这两种类型。参见:ObjectIdToBigIntegerConverter 和 ObjectIdToStringConverter .  或者你可以自定义一个converter, 但我没有去验证。

mongodb出的nosql数据库选型方案

http://www.mongodb.com/lp/whitepaper/nosql-considerations 有自吹的嫌疑,但仍然很有参考价值 ========== 摘抄一段使用nosql的三个动机: (1)In some cases the motivation is technical — such as a need to scale or perform beyond the capabilities of their existing systems — (2)while in other cases companies are driven by the desire to identify viable alternatives to expensive proprietary software. (3)A third motivation is agility or speed of development, …

mongodb出的nosql数据库选型方案 Read More »

mysql数据备份的策略和工具

一般要同时考虑全量备份和增量备份,比如一周一个全量,一天一个增量。 全量备份用mysqldump,一般用它生成一堆sql 增量备份要依赖binlog相关的东西 全量备份和恢复的脚本 备份脚本 引用 #!/bin/sh now_day=`/bin/date +%Y%m%d` now_time=`date +%Y%m%d%H%M%S` data_root=’/somepath/backup’ this_data_dir=$data_root/$now_day this_data_file=$now_time.sql mkdir -p $this_data_dir mysqldump -h host -uuser -ppassword database > $this_data_dir/$this_data_file 将以上脚本加入cron 引用 crontab -e 00 22 * * * /somepath/backup.sh  ##一天一次,每天10点 数据恢复其实就是执行备份出的sql 引用 mysql -h host -uuser -ppassword database < /somepath/some-backup-file.sql 待续