大型MYSQL数据库的问题

时间:2011-07-12 16:42:10

标签: mysql database performance

我现在正在编写一个包含超过20M记录的业务数据库的项目。 这是表结构:

CREATE TABLE IF NOT EXISTS `business` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`rdate` datetime NOT NULL,
`valid` int(1) NOT NULL,
`visible` int(1) NOT NULL,
`lockItem` int(1) NOT NULL,
`parent` int(10) NOT NULL,
`titleENG` varchar(254) COLLATE utf8_bin NOT NULL,
`address` varchar(254) COLLATE utf8_bin NOT NULL,
`city` varchar(254) COLLATE utf8_bin NOT NULL,
`state` varchar(254) COLLATE utf8_bin NOT NULL,
`zipCode` varchar(254) COLLATE utf8_bin NOT NULL,
`country` varchar(254) COLLATE utf8_bin NOT NULL,
`webAddress` varchar(254) COLLATE utf8_bin NOT NULL,
`phone` varchar(254) COLLATE utf8_bin NOT NULL,
`fax` varchar(254) COLLATE utf8_bin NOT NULL,
`contact_name` varchar(254) COLLATE utf8_bin NOT NULL,
`contact_title` varchar(254) COLLATE utf8_bin NOT NULL,
`contact_gender` enum('','male','female') COLLATE utf8_bin NOT NULL,
`company_employee` varchar(254) COLLATE utf8_bin NOT NULL,
`text` text COLLATE utf8_bin NOT NULL,
`bigPic` varchar(254) COLLATE utf8_bin NOT NULL,
`keywords` varchar(254) COLLATE utf8_bin NOT NULL,
`lowerTitle` varchar(256) COLLATE utf8_bin NOT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY `id` (`id`),
 KEY `visible` (`visible`),
 KEY `parent` (`parent`),
 KEY `valid` (`valid`),
 KEY `titleENG` (`titleENG`),
 KEY `state` (`state`),
 KEY `country` (`country`),
 KEY `city` (`city`),
 KEY `keywords` (`keywords`),
 FULLTEXT KEY `titleENG_2` (`titleENG`),
 FULLTEXT KEY `lowerTitle` (`lowerTitle`),
 FULLTEXT KEY `phone` (`phone`),
 FULLTEXT KEY `city_2` (`city`),
 FULLTEXT KEY `state_2` (`state`),
 FULLTEXT KEY `business_search` (`lowerTitle`,`phone`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=12409005 ;

我正在通过全文进行一些查询,想知道我是否可以使用via LIKE和使用lower()函数等,但速度很快。

有人可以给我一些建议吗?

2 个答案:

答案 0 :(得分:0)

您需要做的就是更改所需列的排序规则。例如:

ALTER TABLE `business` CHANGE COLUMN `city` `city` VARCHAR(150) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL;

然后您可以使用相同的全文搜索。

答案 1 :(得分:0)

  • 您已经拥有一个
  • ,因此您不需要ID上的INDEX
  • 使用char-s比使用varchar-s更快MyISAM
  • 如果您不使用bin collat​​ion,则不需要lower()。如果您确实不需要区分大小写,则使用不区分大小写的排序规则
  • 检查您的查询和索引。也许多列上的复合索引将比单个索引(并且每个索引使写入速度更慢)的性能更好
  • 你的写/读比率是多少?如果您有大量插入/更新,则必须最小化索引数量,并考虑迁移到InnoDB
  • 将全文搜索卸载到Sphinx,Solr或任何第三方搜索引擎(或自行构建全文索引)
  • 可见索引似乎没必要 - 该值为0或1,这意味着索引无效,我很确定您没有仅在“可见”上过滤的查询