MySQL-为什么索引列上的select语句返回索引信息,而不是列数据?
我有一个存储活动日志的表(InnoDB)。每行都有一个用户id、一个活动id和位置数据。用户id和活动id列被编入索引,但不是唯一的 当我查询MySQL-为什么索引列上的select语句返回索引信息,而不是列数据?,mysql,Mysql,我有一个存储活动日志的表(InnoDB)。每行都有一个用户id、一个活动id和位置数据。用户id和活动id列被编入索引,但不是唯一的 当我查询选择*时,返回的数据看起来正常- select * from table 当我用另一列(甚至是这两列)查询用户id或活动id时,数据看起来正常 select user_id, city from table select user_id from table where city = 'boulder' 当我使用where语句仅查询用户id或活动id
选择*
时,返回的数据看起来正常-
select * from table
当我用另一列(甚至是这两列)查询用户id或活动id时,数据看起来正常
select user_id, city from table
select user_id from table where city = 'boulder'
当我使用where语句仅查询用户id或活动id时,数据看起来正常
select user_id, city from table
select user_id from table where city = 'boulder'
当我只查询用户id或活动id,或者只查询同一列上带有where语句的id和子字符串查询时,就会出现问题
select user_id from table
或
返回的数据不是字段中的数据,而是看起来像索引位置(或类似位置)的数据。我删除了索引,问题得到了解决,但当我重新添加索引时,问题又出现了
不带索引的示例-
user_id
-------
123456789
231234567
234567543
带索引的示例-
user_id
-------
081357652234
100000000000000
1000000000011
我尝试重新启动服务器,然后从api重新加载数据,但没有任何帮助。我已经在同一数据库中的其他表上进行了测试,但没有遇到此问题
这是我在配置中犯的错误还是错误?我会:
- 更改表的名称(我看到您将其更新为user_activity)以避免可能的错误,因为表名也是sql中的一个关键字
- 对数据库进行备份
- 运行
检查表用户\u活动
查看错误
- 检查用户id是否为int类型
在使用InnoDB时,您不能运行
REPAIR
,但可以查看。转储数据库并重新加载它,以查看您的问题是否是间接的,或者无论发生什么情况都会持续发生。这些用户ID(081357652234和10000000000000)是否不在表中?添加索引可能只是改变了返回结果的顺序。@davidfg4如果这些ID在表中,那么问题就更糟了,因为where子句应该只返回包含12345的ID。在任何情况下,如果问题仅在此表上出现,则运行检查表“table”
进行良好的澄清可能会很有用-它们不在表中。用户id长度限制为12个字符。版本为5.5.31。您如何命名索引?谢谢Joe,我将尝试此操作。我不得不等待一夜之间转储并重新加载数据库,因为它太大了。问题仍然存在。关于varchar创建错误,您似乎是对的-我创建了一个表的副本,删除了索引,将用户id数据类型更改为int,然后重新创建了索引。现在可以了。奇怪的是,这似乎修复了activity_id列(它已经是int数据类型)。谢谢