表的字段越多会影响查询速度吗?

ma2jiajia ma2jiajia 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
mysql 5.1.41

建表语句
CREATE TABLE IF NOT EXISTS `company` (
`id` int(4) NOT NULL AUTO_INCREMENT,
`name` varchar(50) CHARACTER SET gbk NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

CREATE TABLE IF NOT EXISTS `work` (
`id` int(4) NOT NULL AUTO_INCREMENT,
`name` varchar(50) CHARACTER SET gbk NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

CREATE TABLE IF NOT EXISTS `pact` (
`id` int(6) NOT NULL AUTO_INCREMENT,
`cid` int(4) NOT NULL,
`wid` int(4) NOT NULL,
PRIMARY KEY (`id`),
KEY `cid` (`cid`),
KEY `wid` (`wid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

CREATE TABLE IF NOT EXISTS `spec` (
`id` int(6) NOT NULL AUTO_INCREMENT,
`pid` int(6) NOT NULL,
`color` varchar(100) CHARACTER SET gbk NOT NULL,
`size` varchar(10) CHARACTER SET gbk NOT NULL,
`qty` int(10) NOT NULL,
PRIMARY KEY (`id`),
KEY `pid` (`pid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

CREATE TABLE IF NOT EXISTS `goods_in` (
`id` int(6) NOT NULL AUTO_INCREMENT,
`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

CREATE TABLE IF NOT EXISTS `goods_out` (
`id` int(6) NOT NULL AUTO_INCREMENT,
`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

CREATE TABLE IF NOT EXISTS `barcode` (
`barcode` int(11) NOT NULL AUTO_INCREMENT,
`in_id` int(6) NOT NULL DEFAULT '0',
`out_id` int(6) NOT NULL DEFAULT '0',
`sid` int(6) NOT NULL,
`qty` int(3) NOT NULL,
`in_wgt` decimal(7,4) NOT NULL DEFAULT '0.0000',
`out_wgt` decimal(7,4) NOT NULL DEFAULT '0.0000',
PRIMARY KEY (`barcode`),
KEY `in_id` (`in_id`),
KEY `out_id` (`out_id`),
KEY `spec_id` (`sid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

ALTER TABLE `pact`
ADD CONSTRAINT `pact_ibfk_1` FOREIGN KEY (`cid`) REFERENCES `company` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `pact_ibfk_2` FOREIGN KEY (`wid`) REFERENCES `work` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

ALTER TABLE `spec`
ADD CONSTRAINT `spec_ibfk_1` FOREIGN KEY (`pid`) REFERENCES `pact` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

ALTER TABLE `barcode`
ADD CONSTRAINT `barcode_ibfk_1` FOREIGN KEY (`in_id`) REFERENCES `goods_in` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `barcode_ibfk_2` FOREIGN KEY (`out_id`) REFERENCES `goods_out` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `barcode_ibfk_3` FOREIGN KEY (`sid`) REFERENCES `spec` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;


同样的查询语句

SELECT `g`.`id`,DATE_FORMAT(`g`.`date`, '%Y-%m-%d') AS `date`,SUM(`b`.`qty`) AS `qty`,SUM(`b`.`in_wgt`) AS `wgt`,GROUP_CONCAT(DISTINCT `c`.`name`) AS `name`
FROM `goods_in` AS `g`,`barcode` AS `b`,`spec` AS `s`,`pact` AS `p`,`company` AS `c`
WHERE `g`.`id` = `b`.`in_id` AND `b`.`sid` = `s`.`id` AND `s`.`pid` = `p`.`id` AND `p`.`cid` = `c`.`id` AND `b`.`in_id` <> 0
GROUP BY `b`.`in_id`
ORDER BY `b`.`in_id` DESC
LIMIT 0, 100;


数据库A中的表是原始数据,上面查询语句中涉及的表都有其他字段
数据库B是由数据库A导入,并把不相关的表和相关表但不相关的字段都删除掉(上面的建表语句可以看做是数据库B的建表语句,只不过我建立数据库B时,是把数据库A导出,然后删除掉不相关表和约束后,建立数据库B再导入,导入后再把数据库B中的表的不相关字段删掉,然后再建立约束)
同样的这条查询语句,数据库A需要1.5秒以上,而数据库B则只需要0.5秒左右
使用EXPLAIN进行跟踪
数据库A
+----+-------------+-------+--------+---------------+---------+---------+---------------+------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+---------------+---------+---------+---------------+------+----------------------------------------------+
| 1 | SIMPLE | c | index | PRIMARY | name | 102 | NULL | 89 | Using index; Using temporary; Using filesort |
| 1 | SIMPLE | p | ref | PRIMARY,cid | cid | 4 | testA.c.id | 3 | Using index |
| 1 | SIMPLE | s | ref | PRIMARY,pid | pid | 4 | testA.p.id | 6 | Using index |
| 1 | SIMPLE | b | ref | sid,in_id | sid | 4 | testA.s.id | 6 | Using where |
| 1 | SIMPLE | g | eq_ref | PRIMARY | PRIMARY | 4 | testA.b.in_id | 1 | |
+----+-------------+-------+--------+---------------+---------+---------+---------------+------+----------------------------------------------+
数据库B
+----+-------------+-------+--------+---------------+---------+---------+---------------+------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+---------------+---------+---------+---------------+------+----------------------------------------------+
| 1 | SIMPLE | c | index | PRIMARY | name | 102 | NULL | 89 | Using index; Using temporary; Using filesort |
| 1 | SIMPLE | p | ref | PRIMARY,cid | cid | 4 | testB.c.id | 2 | Using index |
| 1 | SIMPLE | s | ref | PRIMARY,pid | pid | 4 | testB.p.id | 6 | Using index |
| 1 | SIMPLE | b | ref | sid,in_id | sid | 4 | testB.s.id | 8 | Using where |
| 1 | SIMPLE | g | eq_ref | PRIMARY | PRIMARY | 4 | testB.b.in_id | 1 | |
+----+-------------+-------+--------+---------------+---------+---------+---------------+------+----------------------------------------------+


P.S.在不使用GROUP_CONCAT函数的情况下,速度差不多
...全文

相关推荐

行业-72 一个表里是不是索引搞的越多越好?那你就大错特错了!l.rar

在数据库管理领域,索引是提升查询性能的关键工具,但是否意味着在一个表中创建越多的索引就越好呢?答案是否定的。本主题将深入探讨这个问题,揭示索引背后的原理,以及如何合理地设计和使用索引。

mYlEaVeiSmVp

mysql中向表中某字段追加字符串的方法

- **删除大表**:删除大量数据时,应考虑使用`DELETE`与`TRUNCATE`的区别。`DELETE`可以有选择性地删除,但速度较慢;而`TRUNCATE`速度快,但会清空整个表。

weixin_38658471

处理group by 查询速度太慢的问题 数据量大.doc

例如,在本实例中,首先了解了查询的业务目标,然后进行测试和分析,最后根据结果将 log_time 字段设置为索引。知识点6:表结构的重要性表结构的设计对查询速度有很大的影响。

sunTeacher

mysql实现多表关联统计(子查询统计)示例

在性能分析方面,使用子查询可以避免数据重复,但可能会影响查询速度。为了提高性能,可以考虑以下优化策略:1. 创建索引:在涉及关联和过滤的字段上创建索引,可以显著加快查询速度。2.

weixin_38530846

mysql优化_提高百万条数据的查询速度

**索引的数量与类型**:并非所有字段都适合建立索引,过多的索引会影响 INSERT 和 UPDATE 的速度。索引的选择应基于实际查询需求。15.

bailong42
评论 13
收藏 已收藏
分享
返回顶部
ma2jiajia
MySQL 57,062 成员 56,759 内容