索引:“[列]”

时间:2018-05-13 09:40:32

标签: mysql indexing mysql-5.7

我正在开发一个已有10年历史的网络应用程序(!!!) &安培;目前在本地运行mysql,版本5.7。

这是我目前正在处理的表格:

CREATE TABLE `processes_history` (
  `p_id` bigint(20) UNSIGNED NOT NULL DEFAULT '0',
  `exec_id` bigint(20) UNSIGNED NOT NULL DEFAULT '0',
  `feature` varchar(100) NOT NULL DEFAULT '',
  `macro` tinyint(1) UNSIGNED NOT NULL DEFAULT '0',
  `ts` date NOT NULL DEFAULT '0000-00-00',
  `seen` int(10) UNSIGNED NOT NULL DEFAULT '1',
  `seen_time` bigint(20) UNSIGNED NOT NULL DEFAULT '0',
  `focus` int(10) UNSIGNED NOT NULL DEFAULT '0',
  `focus_time` bigint(20) UNSIGNED NOT NULL DEFAULT '0',
  `mouse` int(10) UNSIGNED NOT NULL DEFAULT '0',
  `keyboard` int(10) UNSIGNED NOT NULL DEFAULT '0',
  `interactive` int(10) UNSIGNED NOT NULL DEFAULT '0',
  `interactive_time` bigint(20) UNSIGNED NOT NULL DEFAULT '0',
  `last_seen` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=MyISAM DEFAULT CHARSET=utf8
PARTITION BY RANGE (TO_DAYS(`ts`))
(
PARTITION p0 VALUES LESS THAN (736695) ENGINE=MyISAM,
PARTITION p201701 VALUES LESS THAN (736726) ENGINE=MyISAM,
PARTITION p201702 VALUES LESS THAN (736754) ENGINE=MyISAM,
PARTITION p201703 VALUES LESS THAN (736785) ENGINE=MyISAM,
PARTITION p201704 VALUES LESS THAN (736815) ENGINE=MyISAM,
PARTITION p201705 VALUES LESS THAN (736846) ENGINE=MyISAM,
PARTITION p201706 VALUES LESS THAN (736876) ENGINE=MyISAM,
PARTITION p201707 VALUES LESS THAN (736907) ENGINE=MyISAM,
PARTITION p201708 VALUES LESS THAN (736938) ENGINE=MyISAM,
PARTITION p201709 VALUES LESS THAN (736968) ENGINE=MyISAM,
PARTITION p201710 VALUES LESS THAN (736999) ENGINE=MyISAM,
PARTITION p201711 VALUES LESS THAN (737029) ENGINE=MyISAM,
PARTITION p201712 VALUES LESS THAN (737060) ENGINE=MyISAM,
PARTITION p201801 VALUES LESS THAN (737091) ENGINE=MyISAM,
PARTITION pmax VALUES LESS THAN MAXVALUE ENGINE=MyISAM
);

--
-- Indexes for dumped tables
--

--
-- Indexes for table `processes_history`
--
ALTER TABLE `processes_history`
  ADD PRIMARY KEY (`p_id`,`exec_id`,`feature`,`ts`),
  ADD KEY `ts` (`ts`),
  ADD KEY `exec_ts` (`exec_id`,`ts`),
  ADD KEY `last_seen` (`last_seen`);

p_id, exec_id, ts添加索引时,我一直收到错误:

ALTER TABLE `dbname`.`processes_history` ADD INDEX `p_id,exec_id,ts` (`p_id`, `exec_id`, `ts`);
  

错误SQL查询:

     

ALTER TABLE dbnameprocesses_history ADD INDEX p_id,exec_id,ts   (p_idexec_idts)MySQL说:文档

     

1067 - 'ts'

的默认值无效

关注此帖:https://dba.stackexchange.com/questions/192186/on-create-index-invalid-default-value

根据我的理解,使用0000-00-00作为默认值会破坏'日期'类型,这就是它无法正常工作的原因。

但我无法理解这种情况的解决方案是什么。使用TIMESTAMP类型代替?

有没有办法解决这个问题而不破坏结构(至少现在)单位我完成整个网络应用程序?很多东西都依赖于那个表格而且我不想做一些冒险的事情来按照我想要的方式对其进行索引。

3 个答案:

答案 0 :(得分:0)

更改SQL_mode解决了问题:

我比较了MySQL 5.7和5.6,似乎5.7有默认限制:ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, and NO_ENGINE_SUBSTITUTION设置(https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_no_zero_in_date)。

在5.6上:只是NO_ENGINE_SUBSTITUTION (mysql 5.6 manual https://dev.mysql.com/doc/refman/5.6/en/sql-mode.html#sql-mode-setting

要让我的本地mysql(5.7)与生产版本(5.6)同步工作,我只需要set mysql_modeNO_ENGINE_SUBSTITUTION

SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';
SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION';

您可以使用更多信息查看db-stackexchange上的post

答案 1 :(得分:0)

  • 您需要更改为InnoDB - 下一个版本(8.0)已删除MyISAM。
  • 大约在5.6左右,TIMESTAMP的默认值处理发生了变化。想想你拥有什么样的价值观以及你需要什么样的价值观。
  • PARTITIONing很少提高性能;什么查询驱使你使用它?

答案 2 :(得分:0)

暂时使有问题的列成为可空也解决了这个问题。