加入大型 table 越来越慢

Join on large table getting slower

我有 2 个 innoDB tables,一个有 15166897 条记录,另一个有 700000 条记录,有时当服务器上有负载时,基于这些 table 上的电子邮件地址进行简单的连接查询s 花了很多时间来执行,有些时间执行得很快。但是,table 都已正确编入索引。

我们的数据库大约有 800 table 秒,数据库大小为 40GB。我们是 AWS 中的 运行 t2.medium RDS 实例,具有 4GB RAM,其中 3GB 分配给 INNO DB BUFFER POOL。

我有以下问题,请大家指教

  1. 将大 table 分成小 table 是个好主意,这样 table 上的记录就会变少,这会提高查询性能吗?
  2. 随着时间的推移,较大的 table 会降低查询的性能吗?
  3. 这个RDS配置对DB来说是否足够,或者需要改进配置?

编辑: 下面是我的 table 架构和索引定义:

Table 1:总记录数:7,00,000

    CREATE TABLE IF NOT EXISTS `tbl_contact_master` (
  `id` int(11) NOT NULL,
  `first_name` varchar(60) NOT NULL,
  `last_name` varchar(60) NOT NULL,
  `email_address` varchar(250) NOT NULL,
  `agency_name` varchar(150) NOT NULL,
  `state` varchar(30) NOT NULL,
  `zip_code` varchar(20) NOT NULL,
  `srch_zip` varchar(20) NOT NULL,
  `title` varchar(100) NOT NULL,
  `street` varchar(255) NOT NULL,
  `street2` varchar(255) NOT NULL,
  `city` varchar(30) NOT NULL,
  `country` varchar(30) NOT NULL,
  `phone` varchar(20) NOT NULL,
  `ext` varchar(20) NOT NULL,
  `fax` varchar(20) NOT NULL,
  `years_of_experience` varchar(50) DEFAULT NULL,
  `owner_manager` varchar(100) NOT NULL,
  `agency_type` varchar(100) NOT NULL,
  `agency_sales` varchar(100) NOT NULL,
  `agency_website` varchar(100) NOT NULL,
  `agency_host` varchar(100) NOT NULL,
  `agency_host_name` varchar(100) NOT NULL,
  `agency_affiliation` varchar(100) NOT NULL,
  `agent_sales` varchar(100) NOT NULL,
  `id_number_type` varchar(16) NOT NULL,
  `id_number` varchar(15) NOT NULL,
  `destination1` varchar(100) NOT NULL,
  `destination2` varchar(100) NOT NULL,
  `destination3` varchar(100) NOT NULL,
  `travel_type1` varchar(100) NOT NULL,
  `travel_type2` varchar(100) NOT NULL,
  `travel_type3` varchar(100) NOT NULL,
  `travel_type4` varchar(100) NOT NULL,
  `update_first_name` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `update_last_name` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `update_email_address` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `update_agency_name` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `update_state` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `update_zip_code` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `update_title` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `update_street` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `update_street2` datetime NOT NULL,
  `update_city` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `update_country` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `update_phone` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `update_ext` datetime NOT NULL,
  `update_fax` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `update_years_of_experience` datetime NOT NULL,
  `update_owner_manager` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `update_agency_type` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `update_agency_sales` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `update_agency_website` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `update_agency_host` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `update_agency_host_name` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `update_agency_affiliation` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `update_agent_sales` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `update_id_number_type` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `update_id_number` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `update_destination1` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `update_destination2` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `update_destination3` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `update_travel_type1` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `update_travel_type2` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `update_travel_type3` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `update_travel_type4` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `create_status` tinyint(1) NOT NULL COMMENT '1 for website or 0 for add by csv',
  `created_date` datetime NOT NULL,
  `modified_date` datetime NOT NULL,
  `submited_date` datetime NOT NULL,
  `FirstPageDate` datetime NOT NULL,
  `is_retired` tinyint(1) NOT NULL COMMENT '0 = No, 1 = Yes',
  `update_is_retired` datetime NOT NULL,
  `ip_address` varchar(30) NOT NULL,
  `is_bademail` tinyint(1) NOT NULL,
  `update_is_bademail` datetime NOT NULL,
  `is_mice` tinyint(4) NOT NULL DEFAULT '0',
  `update_is_mice` datetime NOT NULL,
  `mice_company_disc` mediumint(5) unsigned NOT NULL,
  `update_mice_company_disc` datetime NOT NULL,
  `mice_meeting_region_plan` text NOT NULL,
  `update_mice_meeting_region_plan` datetime NOT NULL,
  `mice_ida` text NOT NULL,
  `update_mice_ida` datetime NOT NULL,
  `mice_associations` text NOT NULL,
  `update_mice_associations` datetime NOT NULL,
  `mice_meeting_regions` text NOT NULL,
  `update_mice_meeting_regions` datetime NOT NULL,
  `mice_average_attendance` mediumint(5) unsigned NOT NULL,
  `update_mice_average_attendance` datetime NOT NULL,
  `mice_annual_budget` mediumint(5) unsigned NOT NULL,
  `update_mice_annual_budget` datetime NOT NULL,
  `mice_facilities` text NOT NULL,
  `update_mice_facilities` datetime NOT NULL,
  `mice_annual_peak_rooms` mediumint(5) unsigned NOT NULL,
  `update_mice_annual_peak_rooms` datetime NOT NULL,
  `mice_nof_meetings` mediumint(5) unsigned NOT NULL,
  `update_mice_nof_meetings` datetime NOT NULL,
  `mice_job_resp_level` mediumint(5) unsigned NOT NULL,
  `update_mice_job_resp_level` datetime NOT NULL,
  `mice_event_resp_level` mediumint(5) unsigned NOT NULL,
  `update_mice_event_resp_level` datetime NOT NULL,
  `mice_is_planning` mediumint(5) unsigned NOT NULL,
  `update_mice_is_planning` datetime NOT NULL,
  `mice_experience` mediumint(5) unsigned NOT NULL,
  `update_mice_experience` datetime NOT NULL,
  `mice_primary_job` mediumint(5) unsigned NOT NULL,
  `update_mice_primary_job` datetime NOT NULL,
  `mice_company_size` mediumint(5) unsigned NOT NULL,
  `update_mice_company_size` datetime NOT NULL,
  `mice_primary_business` mediumint(5) unsigned NOT NULL,
  `update_mice_primary_business` datetime NOT NULL,
  `mice_primary_business_other` text NOT NULL,
  `mice_event_specialty` text NOT NULL,
  `update_mice_event_specialty` datetime NOT NULL,
  `mice_created_date` datetime NOT NULL,
  `mice_modified_date` datetime NOT NULL,
  `mice_submitted_date` datetime NOT NULL,
  `is_ta` tinyint(4) NOT NULL DEFAULT '0',
  `update_is_ta` datetime NOT NULL,
  `ta_created_date` datetime NOT NULL,
  `ta_modified_date` datetime NOT NULL,
  `ta_submitted_date` datetime NOT NULL,
  `is_mice_retired` tinyint(4) NOT NULL DEFAULT '0',
  `update_is_mice_retired` datetime NOT NULL,
  `not_ta_by` tinyint(2) NOT NULL COMMENT '0 for default, 1 for superadmin, 2 for contact',
  `update_not_ta_by` datetime NOT NULL,
  `not_mice_by` tinyint(2) NOT NULL COMMENT '0 for default, 1 for superadmin, 2 for contact',
  `update_not_mice_by` datetime NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=1096438 DEFAULT CHARSET=latin1;

--
-- Indexes for dumped tables
--

--
-- Indexes for table `tbl_contact_master`
--
ALTER TABLE `tbl_contact_master`
  ADD PRIMARY KEY (`id`),
  ADD KEY `email_address` (`email_address`),
  ADD KEY `is_ta` (`is_ta`),
  ADD KEY `mice_created_date` (`mice_created_date`),
  ADD KEY `mice_modified_date` (`mice_modified_date`),
  ADD KEY `mice_submitted_date` (`mice_submitted_date`),
  ADD KEY `ta_created_date` (`ta_created_date`),
  ADD KEY `ta_modified_date` (`ta_modified_date`),
  ADD KEY `ta_submitted_date` (`ta_submitted_date`),
  ADD KEY `is_mice_retired` (`is_mice_retired`),
  ADD KEY `is_mice` (`is_mice`),
  ADD KEY `is_bademail` (`is_bademail`),
  ADD KEY `is_retired` (`is_retired`),
  ADD KEY `created_date` (`created_date`),
  ADD KEY `modified_date` (`modified_date`),
  ADD KEY `submited_date` (`submited_date`),
  ADD KEY `srch_zip` (`srch_zip`);

Table 2:

CREATE TABLE IF NOT EXISTS `tbl_master_partition` (
  `contact_id` int(10) unsigned NOT NULL,
  `inactive_group` varchar(200) DEFAULT NULL COMMENT '1=15,2=30,3=45,4=60',
  `inactive_from` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Indexes for dumped tables
--

--
-- Indexes for table `tbl_master_partition`
--
ALTER TABLE `tbl_master_partition`
  ADD KEY `contact_id` (`contact_id`), ADD KEY `inactive_group` (`inactive_group`);

Table 3:总记录数:14400000

CREATE TABLE IF NOT EXISTS `tbl_mandrill_email_mapping` (
  `id` bigint(20) NOT NULL,
  `log_id` int(11) NOT NULL,
  `batch_id` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
  `m_id` varchar(50) COLLATE utf8_unicode_ci NOT NULL COMMENT 'unique mandrill message id',
  `s_id` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  `email` varchar(250) COLLATE utf8_unicode_ci NOT NULL,
  `open` int(11) NOT NULL DEFAULT '0',
  `click` int(11) NOT NULL DEFAULT '0',
  `send` int(11) NOT NULL DEFAULT '0',
  `hard_bounce` int(11) NOT NULL DEFAULT '0',
  `soft_bounce` int(11) NOT NULL DEFAULT '0',
  `reject` int(11) NOT NULL DEFAULT '0',
  `spam` int(11) NOT NULL DEFAULT '0',
  `unsub` int(11) NOT NULL DEFAULT '0'
) ENGINE=InnoDB AUTO_INCREMENT=15131814 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

--
-- Indexes for dumped tables
--

--
-- Indexes for table `tbl_mandrill_email_mapping`
--
ALTER TABLE `tbl_mandrill_email_mapping`
  ADD PRIMARY KEY (`id`),
  ADD KEY `m_id` (`m_id`),
  ADD KEY `email` (`email`),
  ADD KEY `hard_bounce` (`hard_bounce`),
  ADD KEY `reject` (`reject`),
  ADD KEY `open` (`open`),
  ADD KEY `click` (`click`),
  ADD KEY `send` (`send`),
  ADD KEY `log_id` (`log_id`),
  ADD KEY `batch_id` (`batch_id`),
  ADD KEY `s_id` (`s_id`);

缺少 TABLE 添加

 CREATE TABLE IF NOT EXISTS `tbl_contact_173_230` (
      `id` int(11) NOT NULL,
      `contact_id` int(11) NOT NULL,
      `salutation` varchar(10) NOT NULL,
      `first_name` varchar(60) NOT NULL,
      `last_name` varchar(60) NOT NULL,
      `email_address` varchar(250) NOT NULL,
      `secondary_email_address` varchar(250) NOT NULL,
      `agency_name` varchar(150) NOT NULL,
      `state` varchar(30) NOT NULL,
      `zip_code` varchar(20) NOT NULL,
      `srch_zip` varchar(20) NOT NULL,
      `title` varchar(255) NOT NULL,
      `street` varchar(255) NOT NULL,
      `street2` varchar(255) NOT NULL,
      `city` varchar(30) NOT NULL,
      `country` varchar(30) NOT NULL,
      `phone` varchar(20) NOT NULL,
      `ext` varchar(20) NOT NULL,
      `fax` varchar(20) NOT NULL,
      `owner_manager` varchar(140) DEFAULT NULL,
      `years_of_experience` varchar(40) DEFAULT NULL,
      `agency_type` varchar(140) NOT NULL,
      `agency_sales` varchar(140) NOT NULL,
      `agency_website` varchar(140) NOT NULL,
      `agency_host` varchar(140) DEFAULT NULL,
      `agency_host_name` varchar(140) NOT NULL,
      `agency_affiliation` varchar(140) NOT NULL,
      `agent_sales` varchar(140) NOT NULL,
      `id_number_type` varchar(16) NOT NULL,
      `id_number` varchar(15) NOT NULL,
      `destination1` varchar(140) NOT NULL,
      `destination2` varchar(140) NOT NULL,
      `destination3` varchar(140) NOT NULL,
      `travel_type1` varchar(140) NOT NULL,
      `travel_type2` varchar(140) NOT NULL,
      `travel_type3` varchar(140) NOT NULL,
      `travel_type4` varchar(140) NOT NULL,
      `update_first_name` datetime NOT NULL,
      `update_last_name` datetime NOT NULL,
      `update_email_address` datetime NOT NULL,
      `update_agency_name` datetime NOT NULL,
      `update_state` datetime NOT NULL,
      `update_zip_code` datetime NOT NULL,
      `update_title` datetime NOT NULL,
      `update_street` datetime NOT NULL,
      `update_street2` datetime NOT NULL,
      `update_city` datetime NOT NULL,
      `update_country` datetime NOT NULL,
      `update_phone` datetime NOT NULL,
      `update_ext` datetime NOT NULL,
      `update_fax` datetime NOT NULL,
      `update_owner_manager` datetime NOT NULL,
      `update_years_of_experience` datetime NOT NULL,
      `update_agency_type` datetime NOT NULL,
      `update_agency_sales` datetime NOT NULL,
      `update_agency_website` datetime NOT NULL,
      `update_agency_host` datetime NOT NULL,
      `update_agency_host_name` datetime NOT NULL,
      `update_agency_affiliation` datetime NOT NULL,
      `update_agent_sales` datetime NOT NULL,
      `update_id_number_type` datetime NOT NULL,
      `update_id_number` datetime NOT NULL,
      `update_destination1` datetime NOT NULL,
      `update_destination2` datetime NOT NULL,
      `update_destination3` datetime NOT NULL,
      `update_travel_type1` datetime NOT NULL,
      `update_travel_type2` datetime NOT NULL,
      `update_travel_type3` datetime NOT NULL,
      `update_travel_type4` datetime NOT NULL,
      `opt_in_marketing` varchar(10) DEFAULT NULL,
      `travel_pro_user` varchar(10) DEFAULT NULL,
      `create_status` tinyint(1) NOT NULL,
      `crm_created_date` datetime NOT NULL,
      `crm_modified_date` datetime NOT NULL,
      `crm_submited_date` datetime NOT NULL,
      `crm_sync_date` datetime NOT NULL,
      `created_date` datetime NOT NULL,
      `modified_date` datetime NOT NULL,
      `submited_date` datetime NOT NULL,
      `offer_entry` datetime NOT NULL,
      `sync_date` datetime NOT NULL,
      `crm_status` tinyint(1) NOT NULL,
      `created_by` int(11) NOT NULL,
      `is_retired` tinyint(1) NOT NULL,
      `update_is_retired` datetime NOT NULL,
      `is_bademail` tinyint(1) NOT NULL,
      `update_is_bademail` datetime NOT NULL,
      `is_ta` tinyint(4) NOT NULL DEFAULT '0',
      `update_is_ta` datetime NOT NULL,
      `ta_created_date` datetime NOT NULL,
      `ta_modified_date` datetime NOT NULL,
      `ta_submitted_date` datetime NOT NULL,
      `mice_company_disc` text NOT NULL,
      `update_mice_company_disc` datetime NOT NULL,
      `mice_meeting_region_plan` text NOT NULL,
      `update_mice_meeting_region_plan` datetime NOT NULL,
      `mice_ida` text NOT NULL,
      `update_mice_ida` datetime NOT NULL,
      `mice_associations` text NOT NULL,
      `update_mice_associations` datetime NOT NULL,
      `mice_meeting_regions` text NOT NULL,
      `update_mice_meeting_regions` datetime NOT NULL,
      `mice_average_attendance` mediumint(5) unsigned NOT NULL,
      `update_mice_average_attendance` datetime NOT NULL,
      `mice_annual_budget` mediumint(5) unsigned NOT NULL,
      `update_mice_annual_budget` datetime NOT NULL,
      `mice_facilities` text NOT NULL,
      `update_mice_facilities` datetime NOT NULL,
      `mice_annual_peak_rooms` mediumint(5) unsigned NOT NULL,
      `update_mice_annual_peak_rooms` datetime NOT NULL,
      `mice_nof_meetings` mediumint(5) unsigned NOT NULL,
      `update_mice_nof_meetings` datetime NOT NULL,
      `mice_job_resp_level` mediumint(5) unsigned NOT NULL,
      `update_mice_job_resp_level` datetime NOT NULL,
      `mice_event_resp_level` mediumint(5) unsigned NOT NULL,
      `update_mice_event_resp_level` datetime NOT NULL,
      `mice_is_planning` mediumint(5) unsigned NOT NULL,
      `update_mice_is_planning` datetime NOT NULL,
      `mice_experience` mediumint(5) unsigned NOT NULL,
      `update_mice_experience` datetime NOT NULL,
      `mice_primary_job` mediumint(5) unsigned NOT NULL,
      `update_mice_primary_job` datetime NOT NULL,
      `mice_company_size` mediumint(5) unsigned NOT NULL,
      `update_mice_company_size` datetime NOT NULL,
      `mice_primary_business` mediumint(5) unsigned NOT NULL,
      `mice_primary_business_other` text NOT NULL,
      `update_mice_primary_business` datetime NOT NULL,
      `mice_event_specialty` text NOT NULL,
      `update_mice_event_specialty` datetime NOT NULL,
      `is_mice` tinyint(4) NOT NULL DEFAULT '0',
      `update_is_mice` datetime NOT NULL,
      `mice_created_date` datetime NOT NULL,
      `mice_modified_date` datetime NOT NULL,
      `mice_submitted_date` datetime NOT NULL,
      `is_mice_retired` tinyint(4) NOT NULL DEFAULT '0',
      `update_is_mice_retired` datetime NOT NULL,
      `recurring_opt_out` tinyint(1) unsigned NOT NULL DEFAULT '0',
      `custom_648` varchar(255) NOT NULL,
      `custom_649` varchar(255) NOT NULL,
      `custom_650` varchar(255) NOT NULL,
      `custom_717` varchar(255) NOT NULL,
      `custom_718` varchar(255) NOT NULL,
      `custom_719` varchar(255) NOT NULL,
      `custom_1369` varchar(255) NOT NULL,
      `custom_1454` varchar(255) NOT NULL,
      `custom_1455` varchar(255) NOT NULL,
      `custom_1469` varchar(255) NOT NULL
    ) ENGINE=InnoDB AUTO_INCREMENT=103603 DEFAULT CHARSET=latin1;

    --
    -- Indexes for table `tbl_contact_173_230`
    --
    ALTER TABLE `tbl_contact_173_230`
      ADD PRIMARY KEY (`id`), 
      ADD KEY `email_address` (`email_address`), 
      ADD KEY `contact_id` (`contact_id`), 
      ADD KEY `zip_code` (`zip_code`), 
      ADD KEY `srch_zip` (`srch_zip`), 
      ADD KEY `ta_submitted_date` (`ta_submitted_date`);

以下是变慢或有时会卡住一个小时的查询。

1.

SELECT  cm.id AS contact_id, mem.email, mem.open
    FROM  tbl_mandrill_email_mapping AS mem
    JOIN  tbl_contact_master AS cm  ON cm.email_address = mem.email
    WHERE  mem.log_id = XXXXX

2.

SELECT  COUNT(crm.id) as total_record, SUM(UPPER(opt_in_marketing)='NO') as unsub_email_count,
        SUM(is_bademail=1) as invalid_email_count, COUNT(DISTINCT mp.`contact_id`) as inactive_email_count,
        SUM(is_retired=1
              OR  is_mice_retired=1
           ) as retired_count
    FROM  (`tbl_contact_173_230` AS crm)
    INNER JOIN  `tbl_mandrill_email_mapping` as mem
        ON `mem`.`email` = `crm`.`email_address`
    LEFT JOIN`tbl_master_partition` AS mp
        ON `mp`.`contact_id` = `crm`.`contact_id`
       AND  crm.`ta_submitted_date` <  '2016-10-19'
       AND  FIND_IN_SET(5, mp.`inactive_group`) > 0
    WHERE  `crm`.`email_address` != '' AND`mem`.`log_id` = 'xxxx'
      AND  `mem`.`open` = 0
      AND  `mem`.`hard_bounce` = 0
      AND  `mem`.`reject` = 0
      AND  `mem`.`spam` = 0
    ORDER BY  `crm`.`id` ASC 

编辑备注: 我注意到,当 tbl_mandrill_email_mapping table 上出现非常频繁的 update/write 时,它主要会产生问题。这是一个处理电子邮件事件(发送、打开、点击、退回等日志)的日志 table。在我的例子中,一旦发出任何批量电子邮件(大约 1,00,000 封电子邮件),这个 table 就会变得非常繁忙,它开始处理所有上述事件,有时这些事件非常频繁,在这种情况下,所有引用 tbl_mandrill_email_mapping卡住。

有什么处理这种情况的建议吗?我正在考虑只读副本,以便所有 update/insert 将由不同的服务器处理并由不同的服务器读取句柄,它会工作吗?或者有什么更好的解决办法来处理这种情况吗?

我愿意接受任何其他建议,请提出建议。

  1. 没有!不要将大的 table 分成小的。您可能已经拥有 "too many tables"。相反,专注于索引。让我们看看 SHOW CREATE TABLE 和一些重要的查询。

  2. table 大小的增长会减慢未能充分利用索引的查询。对于好的索引不是这样。 (也有例外;让我们看看您的查询。)

  3. 你只有4GB?而且您正在将 3GB buffer_pool 硬塞进去?这不会为其他结构或其他应用程序留下太多空间。这可能会导致交换,这对性能来说 非常糟糕 。降 innodb_buffer_pool_size 到 1500M.

增加 'machine' 大小(和 buffer_pool)可能有帮助也可能没有帮助。 buffer_pool 是 "cache",因此 40GB 并不完全相关。我们需要的是"working set size",没有好的指标。

你知道你是I/O-bound吗?或者 CPU-bound?

根据标题,我建议讨论查询。

更多

(现在查看架构)

更多索引 --> 加载速度较慢。通常,一些好的索引非常值得额外的加载时间。但是重点是很少。不要索引标志;它们几乎永远不会有用。 (我假设你的 is_* 列是标志?)

您的应用真的关心每列更新的时间吗?我看到以此类开头的应用程序,但最终放弃了这个想法。

注意不要在JOINing时混用CHARACTER SETsCOLLATIONs。也就是说,在 FROM a JOIN b ON a.x = b.y if xysame CHARACTER SET and COLLATION,则不使用索引

查询 1 将从这个复合(和覆盖)索引中受益:INDEX(log_id, email, open)

我没看到 CREATE TABLE tbl_contact_173_230??