【发布时间】:2010-10-16 09:37:26
【问题描述】:
我目前正在开发一个应用程序,允许用户使用各种参数搜索文档数据库并返回一组分页结果。我在 PHP/MySQL 中构建它,这不是我常用的开发平台,但到目前为止它已经很盛大了。
我遇到的问题是,为了返回完整的结果集,我必须在每个表上使用 LEFT JOIN,这完全破坏了我的性能。开发数据库的人说我正在使用的查询将返回正确的结果,所以这就是我必须使用的。查询如下,我绝不是 SQL Guru,可以在这方面使用一些帮助。
我一直在想,将查询拆分为子查询可能会更好?以下是我当前的查询:
SELECT d.title, d.deposition_id, d.folio_start, d.folio_end, pl.place_id, p.surname, p.forename, p.person_type_id, pt.person_type_desc, p.age, d.manuscript_number, dt.day, dt.month, dt.year, plc.county_id, c.county_desc
FROM deposition d
LEFT JOIN person AS p ON p.deposition_id = d.deposition_id
LEFT JOIN person_type AS pt ON p.person_type_id = pt.person_type_id
LEFT JOIN place_link AS pl ON pl.deposition_id = d.deposition_id
LEFT JOIN date AS dt ON dt.deposition_id = d.deposition_id
LEFT JOIN place AS plc ON pl.place_id = plc.place_id
LEFT JOIN county AS c ON plc.county_id = c.county_id
WHERE 1 AND d.manuscript_number = '840'
GROUP BY d.deposition_id ORDER BY d.folio_start ASC
LIMIT 0, 20
任何帮助或指导将不胜感激!
沉积台:
CREATE TABLE IF NOT EXISTS `deposition` (
`deposition_id` varchar(11) NOT NULL default '',
`manuscript_number` int(10) NOT NULL default '0',
`folio_start` varchar(4) NOT NULL default '0',
`folio_end` varchar(4) default '0',
`page` int(4) default NULL,
`deposition_type_id` int(10) NOT NULL default '0',
`comments` varchar(255) default '',
`title` varchar(255) default NULL,
PRIMARY KEY (`deposition_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
日期表
CREATE TABLE IF NOT EXISTS `date` (
`deposition_id` varchar(11) NOT NULL default '',
`day` int(2) default NULL,
`month` int(2) default NULL,
`year` int(4) default NULL,
PRIMARY KEY (`deposition_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Person_Type
CREATE TABLE IF NOT EXISTS `person_type` (
`person_type_id` int(10) NOT NULL auto_increment,
`person_type_desc` varchar(255) NOT NULL default '',
PRIMARY KEY (`person_type_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=59 ;
【问题讨论】:
-
您的所有用于连接表格的键都有索引吗? (以及在原稿编号上)
-
有关表架构的任何信息,尤其是索引都会更有帮助。
-
这里为什么需要
GROUP BY? -
感谢您的快速回复。 @Quassnoi - Group BY 是因为多个结果将以相同的 deposit_id 返回。基本上我们只想列出 1 个 deposit_id,因为这些会被链接到一个转录本。 @dev0-null-dweller - 我现在将发布表结构。
-
你的数据类型是一团糟尝试为每个字段选择正确的数据类型,即页面 smallint 无符号(2 字节)与有符号整数(4 字节),对开日期为 varchar(4) 所以我猜它们是 2010 年等,因此请使用 smallint unsigned 或适当的日期/时间数据类型。您的主键是 varchar(11) 也许您应该使用代理键 int unsigned (4 bytes) etc etc etc..
标签: php mysql database performance