表的字段多少对查询速度的影响
一个表的字段太多很影响一些查询只需要查询某一个或者几个字段的查询效率,在某些数据库设计的时候,可以将某些很少查询的字段和经常查询的字段分离开来(个人理解为垂直分表),这样MySQL 查询时速度就会有很大提升;我个人觉得这可能是需要用到垂直分表的一些原因;
一、表结构
1、字段较多的表(数据大概30万条)
CREATE TABLE `tb_report_info` (
`ID` char(16) NOT NULL,
`HosipitalName` char(64) NOT NULL DEFAULT '',
`MachNumber` char(16) NOT NULL DEFAULT '',
`PatientNo` char(16) NOT NULL DEFAULT '',
`Telephone` char(16) DEFAULT '',
`PatientName` char(64) NOT NULL DEFAULT '',
`Age` int(11) NOT NULL DEFAULT '0',
`Gender` char(8) NOT NULL DEFAULT '',
`Dept` char(16) NOT NULL DEFAULT '',
`OutPatientNo` char(32) NOT NULL DEFAULT '',
`InPatientNo` char(32) NOT NULL DEFAULT '',
`Height` int(11) NOT NULL DEFAULT '0',
`Weight` int(11) NOT NULL DEFAULT '0',
`DetectType` char(16) NOT NULL DEFAULT '',
`Proofer` char(16) NOT NULL DEFAULT '',
`Auditor` char(16) NOT NULL DEFAULT '',
`NetWorkPrice` char(16) NOT NULL DEFAULT '',
`ExaminationNo` char(16) NOT NULL DEFAULT '',
`ExaminationDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`Stiffness` float(8,2) NOT NULL DEFAULT '0.00',
`Iqr` char(16) NOT NULL DEFAULT '',
`IqrMed` char(16) DEFAULT '',
`SuccessRate` char(8) NOT NULL DEFAULT '',
`SubmitDoctor` char(16) NOT NULL DEFAULT '',
`Diagnostician` char(16) NOT NULL DEFAULT '',
`SecondOpinion` char(255) NOT NULL DEFAULT '',
`Pressure` char(8) NOT NULL DEFAULT '',
`Flai` float(8,2) NOT NULL DEFAULT '0.00',
`FlaiIqr` char(8) NOT NULL DEFAULT '',
`FlaiIqrMed` char(16) DEFAULT '',
`Stiffness1` float(8,2) NOT NULL DEFAULT '0.00',
`Flai1` float(8,2) NOT NULL DEFAULT '0.00',
`Stiffness2` float(8,2) NOT NULL DEFAULT '0.00',
`Flai2` float(8,2) NOT NULL DEFAULT '0.00',
`Stiffness3` float(8,2) NOT NULL DEFAULT '0.00',
`Flai3` float(8,2) NOT NULL DEFAULT '0.00',
`Stiffness4` float(8,2) NOT NULL DEFAULT '0.00',
`Flai4` float(8,2) NOT NULL DEFAULT '0.00',
`Stiffness5` float(8,2) NOT NULL DEFAULT '0.00',
`Flai5` float(8,2) NOT NULL DEFAULT '0.00',
`Stiffness6` float(8,2) NOT NULL DEFAULT '0.00',
`Flai6` float(8,2) NOT NULL DEFAULT '0.00',
`Stiffness7` float(8,2) NOT NULL DEFAULT '0.00',
`Flai7` float(8,2) NOT NULL DEFAULT '0.00',
`Stiffness8` float(8,2) NOT NULL DEFAULT '0.00',
`Flai8` float(8,2) NOT NULL DEFAULT '0.00',
`Stiffness9` float(8,2) NOT NULL DEFAULT '0.00',
`Flai9` float(8,2) NOT NULL DEFAULT '0.00',
`Stiffness10` float(8,2) NOT NULL DEFAULT '0.00',
`Flai10` float(8,2) NOT NULL DEFAULT '0.00',
`FileName` char(64) NOT NULL DEFAULT '',
`FilePath` char(128) NOT NULL DEFAULT '',
`FileSize` char(8) NOT NULL DEFAULT '',
`bAmodeImage` blob,
`bAmodeImageLen` int(11) DEFAULT NULL,
`bTmodeImage` blob,
`bTmodeImageLen` int(11) DEFAULT NULL,
`bEImage` blob,
`bEImageLen` int(11) DEFAULT NULL,
`IsParsed` enum('Y','N') NOT NULL DEFAULT 'N',
`RecvDate` datetime DEFAULT NULL,
`LastTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`ID`,`ExaminationDate`),
KEY `index_exdate` (`ExaminationDate`),
KEY `index_number` (`MachNumber`),
KEY `UnionIndex` (`MachNumber`,`ExaminationNo`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2、字段较少的表(数据跟上表条数相同)
表1:
CREATE TABLE `tb_stiffness_info` (
`Stiffness` float DEFAULT NULL,
`MachNumber` char(16) DEFAULT NULL,
`Age` int(11) DEFAULT NULL,
`Height` int(11) DEFAULT NULL,
`Weight` int(11) DEFAULT NULL,
KEY `machkey` (`MachNumber`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
表二:
CREATE TABLE `tb_stiffness` (
`Stiffness` float DEFAULT NULL,
`MachNumber` char(16) DEFAULT NULL,
KEY `machkey` (`MachNumber`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
二、速度测试
1、单表查询
2、单表分组查询
3、连接查询
综上说明,在我们设计数据库表的时候,我们需要充分考虑业务上的某些需求,将一些不常用的字段和常用的字段分离开来,这样能够让查询常用字段的时候速度得到一定的提升;
以上纯属个人观点,仅供参考!本人较菜,有错误请大家指正!非常感谢!