具有大型数据集的MySQL关系数据库?

时间:2014-10-13 15:41:26

标签: php mysql sql join

我正在尝试从两个共享一个共同的“物种名称”的表中访问数据。领域。

表' coords'是一个非常大的数据集,有超过5500个条目,表本身有大约26个字段。此表的唯一ID是矩阵编号,其运行范围为0-5500,每行包含略微唯一的数据。有多个行具有相同的' SpeciesName'但是 - 只有446个唯一的' SpeciesNames'在表内。

表'常见'存储每个' SpeciesNames'的通用名称和图像数据。有3个字段。基本上我要做的是使用' SpeciesNames'在两个表之间建立一个MySQL关系。作为外键并在一个查询中访问两者的数据。

从哪里开始?谷歌搜索已经产生了处理包含一个或两个字段的表的结果。但是当我查询时,我想从PHP中的BOTH表中选择所有字段。对此有任何建议都很棒。

编辑: 我知道目前数据并不大,但它会是!我应该更清楚这一点。这是' coords':

`Authors` varchar(500) DEFAULT NULL,
  `Journal` varchar(500) DEFAULT NULL,
  `YearPublication` varchar(500) DEFAULT NULL,
  `DOIISBN` varchar(500) DEFAULT NULL,
  `AdditionalSource` varchar(500) DEFAULT NULL,
  `Ecoregion` varchar(500) DEFAULT NULL,
  `GrowthType` varchar(500) DEFAULT NULL,
  `GrowthFormRaunkiaer` varchar(500) DEFAULT NULL,
  `NumberPopulations` varchar(500) DEFAULT NULL,
  `AnnualPeriodicity` varchar(500) DEFAULT NULL,
  `CriteriaSize` varchar(500) DEFAULT NULL,
  `CriteriaOntogeny` varchar(500) DEFAULT NULL,
  `CriteriaAge` varchar(500) DEFAULT NULL,
  `Kingdom` varchar(500) DEFAULT NULL,
  `Phylum` varchar(500) DEFAULT NULL,
  `AngioGymno` varchar(500) DEFAULT NULL,
  `DicotMonoc` varchar(500) DEFAULT NULL,
  `Class` varchar(500) DEFAULT NULL,
  `_Order` varchar(500) DEFAULT NULL,
  `Family` varchar(500) DEFAULT NULL,
  `Genus` varchar(500) DEFAULT NULL,
  `SpeciesName` varchar(500) DEFAULT 'NA',
  `EnteredBy` varchar(500) DEFAULT NULL,
  `EnteredDate` varchar(500) DEFAULT NULL,
  `Source` varchar(500) DEFAULT NULL,
  `SpeciesAuthor` varchar(500) DEFAULT NULL,
  `StudiedSex` varchar(500) DEFAULT NULL,
  `MatrixComposite` varchar(500) DEFAULT NULL,
  `MatrixTreatment` varchar(500) DEFAULT NULL,
  `MatrixCaptivity` varchar(500) DEFAULT NULL,
  `MatrixStartYear` varchar(500) DEFAULT NULL,
  `MatrixStartSeason` varchar(500) DEFAULT NULL,
  `MatrixStartMonth` varchar(500) DEFAULT NULL,
  `MatrixEndYear` varchar(500) DEFAULT NULL,
  `MatrixEndSeason` varchar(500) DEFAULT NULL,
  `MatrixEndMonth` varchar(500) DEFAULT NULL,
  `Population` varchar(500) DEFAULT NULL,
  `LatDeg` varchar(500) DEFAULT NULL,
  `LatMin` varchar(500) DEFAULT NULL,
  `LatSec` varchar(500) DEFAULT NULL,
  `LonDeg` varchar(500) DEFAULT NULL,
  `LonMin` varchar(500) DEFAULT NULL,
  `LonSec` varchar(500) DEFAULT NULL,
  `LatitudeDec` varchar(500) DEFAULT NULL,
  `LongitudeDec` varchar(500) DEFAULT NULL,
  `Altitude` varchar(500) DEFAULT NULL,
  `Country` varchar(500) DEFAULT NULL,
  `Continent` varchar(500) DEFAULT NULL,
  `MatrixSplit` varchar(500) DEFAULT NULL,
  `Observation` varchar(500) DEFAULT NULL,
  `MatrixClassOrganized` varchar(500) DEFAULT NULL,
  `Matrixnumber` varchar(500) NOT NULL DEFAULT '',
  `MatrixClassNumber` varchar(500) DEFAULT NULL,
  `Dimension` varchar(500) DEFAULT NULL,
  `plantType` varchar(500) DEFAULT NULL,
  `matrix` varchar(15000) DEFAULT NULL,
  `_ClassNames` varchar(16000) DEFAULT NULL,
  `StatusStudy` varchar(500) DEFAULT NULL,
  `StatusStudyRef` varchar(500) DEFAULT NULL,
  `StatusElsewhere` varchar(500) DEFAULT NULL,
  `StatusElsewhereRef` varchar(500) DEFAULT NULL,
  PRIMARY KEY (`Matrixnumber`),

'普通':

  `ID` varchar(100) NOT NULL,
  `CommonName` varchar(100) NOT NULL,
  `ImageUrl` varchar(200) NOT NULL,
  `UploadImgUrl` varchar(100) NOT NULL,
  UNIQUE KEY `SpeciesAccepted` (`ID`),
  KEY `ID` (`ID`)

我基本上使用坐标在地图上绘制每条记录并显示来自& coords的所有信息 - 这已经成功实现。表'常见'包含为每个' SpeciesName'动态创建的新信息。 (coords.SpeciesName和common.ID),所以我想显示CommonName并使用' ImageUrl'和' UploadedImgUrl'除了我以前的数据。我还是MySQL的新手,所以如果我的术语不完美,我会道歉!

2 个答案:

答案 0 :(得分:0)

您要找的是database normalization。基本思想是避免在表中使用冗余数据,而只保留您引用的单个值(在您的情况下为SpeciesNames)。

因此,您不会将coords.SpeciesName包含与common.CommonName相同的字符串,而是存储coords.SpeciesName_id的引用,该引用存储common.ID。对于性能调整,这两个字段都应该是INT类型,因为它们可以比字符串更快地进行比较。

要在单个查询中从两个表中获取数据,您可以执行以下操作:

SELECT * FROM coords JOIN common ON coords.SpeciesName_id = common.ID

例如,快速搜索谷歌会产生此intro to normalization

PHP MySQL tutorial的另一次搜索将为您提供有关如何使用PHP执行查询的提示。

答案 1 :(得分:0)

MYSQL的主要问题不是数据库大小或记录号!我见过最多10-12 GB的数据库文件。当您想要获取记录时,我遇到的主要问题是您可能会遇到一次可以处理的查询数量问题!如果你按照执行查询的方式注意,不会发生严重的问题。