MySQL查询全部数据集结果不一致问题解决方案_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 1937 | 回复: 0   主题: MySQL查询全部数据集结果不一致问题解决方案        下一篇 
xuguiju
注册用户
等级:新兵
经验:76
发帖:10
精华:0
注册:2013-7-26
状态:离线
发送短消息息给xuguiju 加好友    发送短消息息给xuguiju 发消息
发表于: IP:您无权察看 2015-5-15 10:33:25 | [全部帖] [楼主帖] 楼主

最近出现一个很奇怪的MySQL问题,使用不同select语句查询全部数据集居然得到不同的记录数。select * 得到4条记录,select 字段得到的是3条记录。

具体问题可以看下面的查询结果:   

[sql]

mysql> select * from table_myisam;

+----------+-------+-----------+------+

datetime uid   content   type

+----------+-------+-----------+------+

1 uid_1 content_1 1

2 uid_2 content_2 1

4 uid_4 content_4 1

3 uid_3 content_3 1

+----------+-------+-----------+------+

4 rows in set (0.00 sec)

mysql> select uid from table_myisam;

+-------+

uid

+-------+

uid_1

uid_2

uid_4

+-------+

3 rows in set (0.00 sec)

通过select uid只得到3行记录,丢失了其中uid='uid_3'的记录。本来百思不得其解,后来在同事的提醒下使用了check table,才找到问题的所在。

[sql]

mysql> check table table_myisam;

+--------------------+-------+----------+-------------------------------------------------------+

Table  Op Msg_type Msg_text

+--------------------+-------+----------+-------------------------------------------------------+

qitai.table_myisam check warning  1 client is using or hasn't closed the table properly

qitai.table_myisam check warning  Size of indexfile is: 2049  Should be: 2048

qitai.table_myisam check error Found 3 keys of 4

qitai.table_myisam check error Corrupt

+--------------------+-------+----------+-------------------------------------------------------+

查询数据不一致的原因是table_myisam的索引文件损坏了,对应的索引文件table_myisam.MYI与数据文件table_myisam.MYD不一致。select *并不需要遍历每个索引项,只需要获取第一条记录,根据链表顺序访问,因此当前的索引损坏并没有影响到select *的使用。而select uid需要遍历所有索引项,因而只获取到损坏状态,三条索引记录。

   解决方案是使用repair table进行表索引的修复。

[sql]

mysql> repair table table_myisam;

+--------------------+--------+----------+----------+

Table  Op Msg_type Msg_text

+--------------------+--------+----------+----------+

qitai.table_myisam repair status   OK

+--------------------+--------+----------+----------+

1 row in set (0.00 sec)

修复后使用check table可以看到表状态变成正常,使用select *与select uid都能获取到4条记录。

[sql]

mysql> check table table_myisam;

+--------------------+-------+----------+----------+

Table  Op Msg_type Msg_text

+--------------------+-------+----------+----------+

qitai.table_myisam check status   OK

+--------------------+-------+----------+----------+

1 row in set (0.00 sec)

--转自 北京联动北方科技有限公司




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论