Tag: mysql

求MYSQL中对相邻两行的操作的方法

现在表中分段记录了一些信息 如 user_id begin end duration type begin end是起始和截止时间 duration=end-begin 有个最大限制;所以造成了记录上的分段. type: 有first,middle, last.代表是分段的次序.中间可能有多个middle. eg: | bceedabcecdgdcf | 2011-03-02 09:49:57 | 2011-03-02 10:04:57 |900 | first | | bceedabcecdgdcf | 2011-03-02 10:04:57 | 2011-03-02 10:19:57 |900 | middle | | bceedabcecdgdcf | 2011-03-02 10:19:57 | 2011-03-02 10:22:03 |126 | last | 现在相把连续的多行合并成一条记录.如何操作? 如上述变成 | bceedabcecdgdcf […]

怎样设计一个轻量的用户autocomplete系统

我最近在设计一个系统时需要有一个用户下拉选择的功能,设计成输入首字母自动联想的autocomplete模式。现在在设计后端数据结构上遇到了些麻烦。目前是我直接用mysql的LIKE来做的这一功能,但如果随着用户和访问量的增长,这样肯定很慢。 我使用的是redis缓存,用redis的朋友都应该读过那篇用redis实现autocomplete的文章。不过我要说的是,这篇文章并不解决我的问题。因为它只能完成关键词的联想功能,但它的关键词是无状态的,没有任何索引标记它的id。也就是说它除了能完成自动联想以外,无法完成关键词与用户的关联过程。 另一个缺点是,这玩意索引的代价太高了,要对每个字都做分词,然后存入cache中做索引。而用户名是可以修改的,我觉得每次修改再重建索引的成本太大。 我想了另一个方案,利用redis的交集功能来做搜索,这也是比较流行的方法。比如一个用户名叫Hello,用php代码来展示如何处理这个用户名,为了展示方便,我只处理英文字母 $user_name = strtolower(‘Hello’); $user_id = 1001; $len = strlen($user_name); for ($pos = 0; $pos < $len; $pos ++) { $key = md5($user_name[$pos]); $redis->sAdd(‘user_name:’ . $key . ‘:’ . $pos, $user_id); } 在上面的代码中,我把每个字母用md5哈希一下然后和他的位置值$pos共同组成一个redis索引。这样如果在所有用户名都用这种办法做索引后,我们就可以使用redis的交集功能来做搜索了 $keyword = strtolower(‘he’); // 测试的关键词 $indexes = array(); // 索引集合 $len = strlen($keyword); for ($pos = 0; $pos < […]

在windows下mysql的变量不能作为条件使用索引?

set @a=’test’; explain select * from tabl1 where col1=@a; ubuntu下可以提示使用索引 但在windows server 2008下 就没有提示使用索引。 另外在存储过程中,在ubuntu下可以跑得sql代码,到windows下很慢,查看是不使用索引的缘故。 在存储过程中有 insert into table2 select * from table1 where col1=_var; 对于这个_var变量,在windows并不使用索引。 —————-20110829 14:30————————————– 早上把mysql服务重启了一下然后 set @a=’test’; explain select * from tabl1 where col1=@a 不使用的索引的情况没了。 但是在存储过程中 declare _area varchar(10); set _aera=’area_test’; explain select * from temp_cell a where a.area=_area; 还是不使用索引。 然后我就改用 […]

mysql的MYISAM引擎中有没有sequence id,为什么没有指定order by的时候顺序会打乱

我想到这个问题是从观察mysql的自然排序状态引发的,我们用的很多mysql管理软件,在列出表数据时一般都用的以下代码 SELECT * FROM table_name LIMIT x OFFSET y 这个时候没有指定任何排序字段,那么在mysql内部就应该有一个类似oracle或者pgsql里面sequence id的东西,做为它的默认索引来实现排序之类的东西。但我从来没看到有人提过mysql有这个玩意。 另一个佐证是如果你指定了一个自增id作为主键,在我们预想中如果执行上面的语句,主键的排序顺序应该一致,实际上并不是这样,虽然大部分是一致的,但是有少部分会打乱。因此他一定有一个内部的排序机制,这个机制是什么?

mysql突然很慢,慢到50多秒

经检查发现是内存的临时表空间似乎没清除,重启mysql就好了。 windows nt环境。 有没有好的解决办法呢?

MySQL 多库切换查询效率问题

某DB机器上有n个库,某进程对其查询时需要从各个库中获取不同类型的数据,请问是创建n个连接(各自对应不同的库)分别查库好,还是一个连接根据需要时再select db? 两种方式在效率上是否会有较大差别? 多谢。

mysql 转 nosql 的逻辑问题

我所使用的nosql是很简单的key-value型 复杂的关系查询如何实现? 实例场景:mysql的某个表包含id,date,param,title,content字段,查询需求有两种,一个是通过id,date,param的递增递减或相等的方式获取列表。一个是直接通过id获取所有内容。 现在转到nosql,很轻松的实现了后者,但是前者要如何实现?比如获取param = a的列表或者date小于某个时间的列表。 我目前使用的mysql的数据表名+下划线+id来命名的key,value存放的是查询到的结果数组,比如 key = post_12 value = array([id] => ’12’,date => ‘20110101’,param => ‘a’,title => ‘标题’,content => ‘内容’)

mysql innodb 并发插入问题,包大量死锁错误

开了10个并发写线程,没1000条记录批量提交一次,结果mysql包大量死锁错误! "Deadlock found when trying to get lock; try restarting transaction" 引擎用的是Innodb 主键字段是auto_increament. mysql 有这么脆弱吗? create table ASIA_ODDS( id int NOT NULL AUTO_INCREMENT, match_id INT DEFAULT 0, match_bet007_id INT NOT NULL, company_id SMALLINT NOT NULL , first_pk DECIMAL(9,4) DEFAULT 0, first_host_odds DECIMAL(9,4) DEFAULT 0, first_guest_odds DECIMAL(9,4) DEFAULT 0, pk DECIMAL(9,4) , host_odds DECIMAL(9,4) DEFAULT 0, […]

MySQL数据排序

SELECT c.WORK_DATE, c.ONDUTY_TIME, c.OFFDUTY_TIME, group_concat(d.start_date) startDate, group_concat(d.end_date) endDate, group_concat(d.duty_explain) dutyExplain, group_concat(d.duty_status_id) dutyStatusId FROM (SELECT a.WORK_DATE, a.ONDUTY_TIME, a.OFFDUTY_TIME, b.DUTY_APPLY_ID FROM (SELECT ONDUTY_TIME, OFFDUTY_TIME, WORK_DATE, SEQ_ID FROM tbl_duty WHERE USER_ID = ‘xiaodong’ AND WORK_DATE >= ‘2012/3/20 星期二 0:00:00’ AND WORK_DATE <= ‘2012/3/29 星期二 0:00:00’) a LEFT JOIN tbl_duty_to_apply b ON a.seq_id = b.DUTY_ID) c LEFT JOIN tbl_duty_apply […]

mysql根据字段分表问题

我用户表里有几个字段,如:登录次数,收藏次数,喜欢次数等等,这样的统计字段,大家觉得是跟User表设计在一块好还是单独设计一张UserCounter表来专门存这些统计字段分开好一点?

.