Mysql 具有重复文本值的表列

Mysql 具有重复文本值的表列,mysql,sql,mariadb,Mysql,Sql,Mariadb,我有一个数据库表,其中a有一个varchar(200)列。 这是一个包含历史日志信息的表,其中表中约99.9%的行包含与表中另一行相同的文本消息。 数据库的大小和搜索速度成为一个问题 所以我想我可以将varchar值移动到另一个具有唯一文本值的表中,然后对第一个表中的每一行引用该表,但在我更改之前,我想知道是否有更简单的方法来执行此操作? 例如,在我现有的表列上设置一些属性,这些属性会自动导致这种行为。因此,数据库自动维护一个具有唯一文本的表。我意识到这当然会对删除操作的性能产生很大影响,但无论

我有一个数据库表,其中a有一个varchar(200)列。
这是一个包含历史日志信息的表,其中表中约99.9%的行包含与表中另一行相同的文本消息。
数据库的大小和搜索速度成为一个问题

所以我想我可以将varchar值移动到另一个具有唯一文本值的表中,然后对第一个表中的每一行引用该表,但在我更改之前,我想知道是否有更简单的方法来执行此操作?
例如,在我现有的表列上设置一些属性,这些属性会自动导致这种行为。因此,数据库自动维护一个具有唯一文本的表。我意识到这当然会对删除操作的性能产生很大影响,但无论如何,这几乎从来没有做到过。 另外,我真的希望避免更改插入日志表的程序

我一直在使用MySQL,但如果另一个数据库可以做到这一点,也可以选择将数据库更改为另一个数据库。(马里亚布还是其他?)


谢谢,这是进行规范化的正确方法,但我的建议是,不要使用唯一文本,而是使用数字(整数)…

没有任何属性或任何东西可以为您处理此问题,但是您有一个好主意,将varchar数据放在一个单独的表中。为此,请执行以下步骤

  • 创建包含varchar数据的表,如下所示:

    CREATE TABLE log_messages(id int auto_increment主键,message varchar(200))ENGINE=MyISAM ROW_FORMAT=FIXED

  • 插入您的varchar数据

    插入日志消息(消息)
    选择您的\u varchar\u列
    从你的桌子上

  • 在原始表中添加新列以引用新的日志消息表

    altertable\u TABLE添加列消息\u id int not null

  • 创建引用

    更新您的\u表y内部连接日志\u消息m ON y.your\u varchar\u column=m.message
    设置y.message_id=m.id

  • 然后可以从表中删除varchar列

    ALTER TABLE your_TABLE DROP COLUMN your_varchar_COLUMN


  • 既然您已经了解了这一点,我不知道您为什么会担心删除操作的性能影响。没有

    你想在这里实现什么-正常化还是提高速度?如果这只是一个历史日志,那么你为什么首先要登录MySQL?我的第一个目标是减少数据库的大小。我需要在日志中搜索,这就是我使用数据库的原因。数据中也有时间戳和其他Colmun。你为什么不每天、每周或每月单独制作表格呢?因为你现在要缩小尺寸,但是3个月后呢?还是6?谢谢你的回答。如果我必须重做,我也会那样做。我只是想确保我没有在数据库可以为我处理的事情上浪费时间。