大型数据集的MySQL关系数据库


MySQL relational databases with large dataset?

我正试图访问共享一个公共"SpeciesName"字段的两个表中的数据。

表"coords"是一个非常大的数据集,有5500多个条目,表本身大约有26个字段。此表的唯一ID是矩阵编号,从0-5500开始,每行包含稍微唯一的数据。但是,存在多个具有相同"SpeciesName"的行-表中只有446个唯一的"SpeciesNames"。

表"common"存储每个"SpeciesNames"的通用名称和图像数据,其中包含3个字段。基本上,我想做的是使用"SpeciesNames"作为外键在两个表之间建立MySQL关系,并在一个查询中访问这两个表的数据。

从哪里开始?谷歌搜索已经产生了处理包含一个或两个字段的表的结果。但是,当我进行查询时,我希望从PHP中的BOTH表中选择ALL字段。任何关于这方面的建议都将是美妙的。

编辑:我知道目前的数据不多,但会的!我本应该更清楚的。这是"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`)

我基本上是用坐标在地图上绘制每条记录,并显示"坐标"中的所有信息——这已经成功实现了。表"common"包含为每个"SpeciesName"(coords.SpeciesName和common.ID)动态创建的新信息,因此我想显示CommonName,并将"ImageUrl"answers"UploadedImgUrl"与我以前拥有的数据一起使用。我还是MySQL的一个新手,所以如果我的术语不完美,我很抱歉!

MYSQL的主要问题不是数据库大小或记录数!我见过高达10-12 GB的数据库文件。主要问题可能发生在您想要获取记录的时候,并且您可能会面临一次可以处理的查询数量的问题!如果您在执行查询时注意,就不会出现严重的问题。

您正在寻找的是数据库规范化。其基本思想是避免表中存在冗余数据,而只保留您引用的单个值(在您的情况下为SpeciesNames)。

因此,您可以将引用存储为存储common.IDcoords.SpeciesName_id,而不是coords.SpeciesName,它包含与common.CommonName相同的字符串。这两个字段的类型都应该是INT,因为它们的比较速度比字符串快得多。

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

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

例如,在谷歌上快速搜索就会得到这篇关于规范化的介绍。

另一个PHP MySQL搜索教程将为您提供如何使用PHP执行查询的提示。