SQL表拆分 - 是否必要

时间:2012-02-13 09:39:49

标签: mysql sql-execution-plan

我有一张约有6到7个记录的表格,随着时间的推移它会增长。它有大约16-20列。这些专栏中没有任何一对多的关系。

用户数据条目存储在这些表中。

将表格拆分成多个小表是否可行,或者只是将表格分成2个半部分,其中包含所有条目和其他最近新记录,这些记录将出现给数据输入运算符以供入他们的条目。

简而言之,我的问题是,如果我分割表格,mysql执行时间是否会更快,或者如果我将它们分成两半,它会更快。

我猜后者会更可行,因为它不会执行任何连接查询。

更新:

CREATE TABLE `images` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `primary_category_id` int(10) unsigned DEFAULT NULL,
  `secondary_category_id` int(10) unsigned DEFAULT NULL,
  `front_url` varchar(255) DEFAULT NULL,
  `back_url` varchar(255) DEFAULT NULL,
  `title` varchar(100) DEFAULT NULL,
  `part` varchar(10) DEFAULT NULL,
  `photo_id` int(10) unsigned DEFAULT NULL,
  `photo_dt_month` varchar(2) DEFAULT NULL,
  `photo_dt_day` varchar(2) DEFAULT NULL,
  `photo_dt_yr` varchar(4) DEFAULT NULL,
  `type` varchar(25) DEFAULT NULL,
  `size_width` int(10) unsigned DEFAULT NULL,
  `size_height` int(10) unsigned DEFAULT NULL,
  `dpi` int(10) unsigned NOT NULL DEFAULT '0',
  `dpix` int(10) unsigned DEFAULT NULL,
  `dpiy` int(10) unsigned DEFAULT NULL,
  `in_stock` varchar(50) DEFAULT NULL,
  `outlet` varchar(50) DEFAULT NULL,
  `source` varchar(50) DEFAULT NULL,
  `keywords` varchar(255) DEFAULT NULL,
  `emotional_keywords` varchar(255) DEFAULT NULL,
  `mechanical_keywords` varchar(255) DEFAULT NULL,
  `description` text,
  `notes` text,
  `comments` text,
  `exported_to_ebay_dt` datetime DEFAULT NULL,
  `exported_to_ebay` set('Y','N') NOT NULL DEFAULT 'N',
  `updated_worker_id` int(10) unsigned DEFAULT NULL,
  `updated_worker_dt` datetime DEFAULT NULL,
  `locked_worker_id` int(10) unsigned DEFAULT NULL,
  `locked_worker_dt` datetime DEFAULT NULL,
  `updated_admin_id` int(10) unsigned DEFAULT NULL,
  `updated_admin_dt` datetime DEFAULT NULL,
  `added_dt` datetime DEFAULT NULL,
  `updated_manager_id` int(10) unsigned DEFAULT NULL,
  `updated_manager_dt` datetime DEFAULT NULL,
  `manager_review` set('Y','N') NOT NULL DEFAULT 'N',
  `paid_status` set('Y','N') NOT NULL DEFAULT 'N',
  `exported_to_web_dt` datetime DEFAULT NULL,
  `exported_to_web` set('Y','N') DEFAULT 'N',
  `prefix` varchar(50) DEFAULT NULL,
  `is_premium` set('Y','N') DEFAULT 'N',
  `template` varchar(50) DEFAULT 'HIPE_default',
  `photographer` varchar(100) DEFAULT NULL,
  `copyright` varchar(100) DEFAULT NULL,
  `priority` int(4) DEFAULT '1',
  `step` set('1','2') DEFAULT '1',
  PRIMARY KEY (`id`),
  UNIQUE KEY `part` (`part`),
  KEY `primary_category_id` (`primary_category_id`),
  KEY `updated_worker_id` (`updated_worker_id`),
  KEY `updated_worker_dt` (`updated_worker_dt`)
) ENGINE=MyISAM AUTO_INCREMENT=1013687 DEFAULT CHARSET=latin1

以上是我的表格结构。在有条目说明1lac之后我会把它拆分成另一个表格,其中images_history具有相同的结构。这是可行的还是应该将它们分成多个表来减少查询执行时间< / p>

1 个答案:

答案 0 :(得分:1)

为什么要拆分桌子?如果您仍想访问两个新表,它将导致大量额外代码并通过添加额外查询来减慢执行时间。 (如果其中一个表要存储很少使用的图像表的先前版本的记录 - 即版本控制 - 它可能仍然是个好主意)。

在考虑拆分表之前,看看是否可以通过确保以下任何性能灾难都不是优化现有代码来提高性能:

  • 按PRIMARY KEY过滤所有SELECT吗?
  • 索引缓存是否足以容纳计算机RAM中的所有索引?
  • 是否有任何字符串使用索引与SELECT匹配LIKE?即只有完全匹配或通配符在右边,从不在左边(例如“searchword%”,从不“%searchword”
  • 是否存在使用SELECT *而不是仅选择所需列的慢速执行查询?
  • 您是否避免在SELECT中使用OR?

如果正确编制了表格并且查询实际上正在使用这些索引,那么对具有700 000条记录的表执行查询的速度应该不会很慢。