Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql性能问题-本质上是关于规范化效率_Mysql_Database_Performance - Fatal编程技术网

Mysql性能问题-本质上是关于规范化效率

Mysql性能问题-本质上是关于规范化效率,mysql,database,performance,Mysql,Database,Performance,只是一个关于数据库性能的简单问题。我将在下面概述我的网站用途作为背景 我正在创建一个字典网站,将用户定义的单词保存到数据库中。我想知道的是,是为每个用户创建一个单词表,还是保留一个庞大的单词表。这个网站将用于整个学校,所以单字表将是巨大的 数据库结构如下: 包含以下内容的用户表: 用户ID主键 用户名 首先 最后 密码 电子邮件 国家 研究 排名 发送信息 捐赠 JoinedOn 最后登录 登录 正确的 尝试 管理员 活跃的 和一个单词表,其中包含: 用户ID主键 话 沃卡布 咒语 明确的

只是一个关于数据库性能的简单问题。我将在下面概述我的网站用途作为背景

我正在创建一个字典网站,将用户定义的单词保存到数据库中。我想知道的是,是为每个用户创建一个单词表,还是保留一个庞大的单词表。这个网站将用于整个学校,所以单字表将是巨大的

数据库结构如下:

包含以下内容的用户表:

  • 用户ID主键
  • 用户名
  • 首先
  • 最后
  • 密码
  • 电子邮件
  • 国家
  • 研究
  • 排名
  • 发送信息
  • 捐赠
  • JoinedOn
  • 最后登录
  • 登录
  • 正确的
  • 尝试
  • 管理员
  • 活跃的
和一个单词表,其中包含:

  • 用户ID主键
  • 沃卡布
  • 咒语
  • 明确的
  • 确定意图
  • 拼写
  • 迷住
  • 判刑
  • 判决
因此,我要问的是,从性能角度来看,我是否应该在每个用户加入网站时为他们创建一个新的表——随着时间的推移,每个用户可能有数百或数千个单词?或者最好是有一个包含成千上万条记录的大型表,并按用户ID进行筛选。我认为我不会执行很多表联接


我的直觉是为每个用户创建一个新表,但我想我应该征求专家的意见!提前感谢。

对于非常大的数据集,您可以通过为每个用户将字典单词存储在单独的表中来获得更好的性能

CREATE TABLE users (
  id INT PRIMARY KEY AUTO_INCREMENT,
  username VARCHAR(32) UNIQUE,
  first VARCHAR(128) CHARACTER SET utf8 COLLATE utf8_unicode_ci,
  last VARCHAR(128) CHARACTER SET utf8 COLLATE utf8_unicode_ci,
  ...
) Engine=InnoDB;

-- table of english words
CREATE TABLE vocabulary (
  id INT PRIMARY KEY AUTO_INCREMENT,
  user_id INT,
  word VARCHAR(45), 
  ...
  -- searches for words of a given user should use `user_word`
  UNIQUE INDEX user_word (user_id, word),
  INDEX (word),
  FOREIGN KEY user (user_id) REFERENCES users (id) 
      ON DELETE CASCADE ON UPDATE CASCADE
) Engine=InnoDB CHARACTER SET utf8 COLLATE utf8_unicode_ci;
但是,如果您想对所有单词运行查询,例如,为了进行统计分析,那么编写一个查询来访问每个人的单词将非常困难

您可以将所有单词存储在同一个表中,然后如果性能出现问题,您可以始终对表进行分区,对用户id进行散列。查找MySQL的“分区”。它基本上将数据存储在单独的文件中,但允许您将所有数据保存在同一个逻辑表中,因此很容易查询并保持正常形式

只要将用户id上的单词编入索引,在相当长的一段时间内,性能不太可能降低,并且应用程序可能永远不会达到该阈值


从开发的角度来看,通过保持简单并将所有单词存储在同一个表中,您将节省数小时的时间。由于您有一个解决未来问题的方法,如果出现性能问题,请保持简单,并尽可能少地完成项目。

对于非常大的数据集,您可以通过为每个用户将字典单词存储在单独的表中来获得更好的性能

CREATE TABLE users (
  id INT PRIMARY KEY AUTO_INCREMENT,
  username VARCHAR(32) UNIQUE,
  first VARCHAR(128) CHARACTER SET utf8 COLLATE utf8_unicode_ci,
  last VARCHAR(128) CHARACTER SET utf8 COLLATE utf8_unicode_ci,
  ...
) Engine=InnoDB;

-- table of english words
CREATE TABLE vocabulary (
  id INT PRIMARY KEY AUTO_INCREMENT,
  user_id INT,
  word VARCHAR(45), 
  ...
  -- searches for words of a given user should use `user_word`
  UNIQUE INDEX user_word (user_id, word),
  INDEX (word),
  FOREIGN KEY user (user_id) REFERENCES users (id) 
      ON DELETE CASCADE ON UPDATE CASCADE
) Engine=InnoDB CHARACTER SET utf8 COLLATE utf8_unicode_ci;
但是,如果您想对所有单词运行查询,例如,为了进行统计分析,那么编写一个查询来访问每个人的单词将非常困难

您可以将所有单词存储在同一个表中,然后如果性能出现问题,您可以始终对表进行分区,对用户id进行散列。查找MySQL的“分区”。它基本上将数据存储在单独的文件中,但允许您将所有数据保存在同一个逻辑表中,因此很容易查询并保持正常形式

只要将用户id上的单词编入索引,在相当长的一段时间内,性能不太可能降低,并且应用程序可能永远不会达到该阈值


从开发的角度来看,通过保持简单并将所有单词存储在同一个表中,您将节省数小时的时间。由于您有一个解决未来问题的方法,如果出现性能问题,请保持简单,以最小的努力完成项目。

我认为您应该为所有用户和用户id使用一个表


任何语言中都没有那么多的单词。据我所知,超过几百万人。数据库在处理100-200万条记录时运行良好,考虑到英语中的所有单词都超过170.000个,您不会很快达到这一水平。我认为您应该为所有用户和用户id使用一个表


任何语言中都没有那么多的单词。据我所知,超过几百万人。数据库在处理100-200万条记录时运行良好,考虑到英语中的所有单词数都超过170.000个,您不可能很快达到这一水平。如果某组列作为索引键的前缀,则通常可以使用来获取行,而无需扫描表。有些查询不会使用索引(例如,如果某个列只出现在某些列中),但这些查询不包括为给定用户查找单词;此外,如果每个用户都有一个表,那么这些查询将更加困难

CREATE TABLE users (
  id INT PRIMARY KEY AUTO_INCREMENT,
  username VARCHAR(32) UNIQUE,
  first VARCHAR(128) CHARACTER SET utf8 COLLATE utf8_unicode_ci,
  last VARCHAR(128) CHARACTER SET utf8 COLLATE utf8_unicode_ci,
  ...
) Engine=InnoDB;

-- table of english words
CREATE TABLE vocabulary (
  id INT PRIMARY KEY AUTO_INCREMENT,
  user_id INT,
  word VARCHAR(45), 
  ...
  -- searches for words of a given user should use `user_word`
  UNIQUE INDEX user_word (user_id, word),
  INDEX (word),
  FOREIGN KEY user (user_id) REFERENCES users (id) 
      ON DELETE CASCADE ON UPDATE CASCADE
) Engine=InnoDB CHARACTER SET utf8 COLLATE utf8_unicode_ci;
离题 我们可以有
中名
列,而不是
列和
列,因为并非所有文化都将。当然,我们还需要记录姓名的打印顺序。另一个选项是为名称和给定名称设置列


word
列为45个字符,以容纳英语中最长的单词,即构造的单词“肺炎微镜矽肺孢子虫病”。对于德语单词,我们至少需要63个字符。“Rindflieschetikettierungsüberwachungsaufgabenübertragungsgesetz”实际上被使用,而不仅仅是试图使用最长的单词。考虑到德语的本质,试图找到最长的单词长度是徒劳的;最好随便挑一个。on键大小(MySQL 5.0.17及更高版本中为3072字节,MySQL 5.0.15及更低版本中为1023字节)对
单词的大小设置了3066(5.0.15版本中为1018)字节的上限,即(字典排序)中为3066(1018)个字符,UTF-8中为1022(339)个字符

性能方面,依赖于指数。如果某组列的前缀为t