MySQL构建表优化策略综述
选择1。字符集1
2。主键1
三.外键2
4。指数2
以下4.1。适合创建索引2。
在4.2的情况下不适合创建索引3。
4.3。联合指数3
4.4。指数长度4
5。专业4
5.1。冗余字段4
5.2。分区域4
5.3。BLOB和CLOB 5
6。特殊的5
6.1。分区表5
6.2。使用非事务表类型5
选择1。字符集
如果确认它是中国所有GBK是第一选择,没有多的语言和文字不能表达的中国。
使用UTF-8编码需要3个字节,而GBK只占用2字节。
2。主键
尽可能短的使用主关键字。
该系统具有自我提高auto_incremen类型,而不是为这种类型的使用UUID()。如果你可以使用外键做主键,这是更好的。例如,1:1的关系,采用主表的ID从表的主键。
主键的字段长度需要指定。
Tinyint从2到127的7倍:1 - 127 - 128
从2到32767 15次返回- 1 - 32768:32767
23平方1 MEDIUMINT代表2:从8388608到8388607
int是31的平方,2的1。
时长是一个63平方1 2
没有必要在主键上构建一个单独的索引,因为系统内部为主键建立了一个集群索引。
在其他索引上允许主键列。
三.外键
外部键影响插入和更新性能。对于批处理和可靠数据的插入,建议先对外部密钥检查进行筛选。
对于大量数据,建议通过使用数据完整性检查来消除外键。
主表的键尽可能用作外键,以避免选择大长度的主表作为外键。
外键是默认加索引。
4。指数
创建索引,在适当的表和适当的列上创建适当的索引数。查询优先级与更新优先级之间的平衡。
以下4.1。适合创建索引。
可以在需要搜索的列上加速搜索速度。
在主键的列上,列的唯一性和组织表中数据的排列。
在常用的列中,这些列主要是加快连接速度的外键。
索引是在一个列中创建的,该列经常需要根据范围进行搜索,因为索引已经排序,索引的范围是连续的。
索引是在经常需要排序的列上创建的,因为索引已经进行了排序,因此查询可以利用索引的类型来加快排序查询时间。
索引是在WHERE子句中经常使用的列上创建的,以加速条件。
指数低于4.2。不适合创建索引。
不应该为查询中很少使用或引用的列创建索引,这是因为这些列很少使用,有索引或没有索引,查询速度不能提高,相反,索引的增加降低了系统的维护速度,增加了对空间的需求。
该指数不应该被添加到这些栏目,只有很少的数据值。这是因为,由于这些列的值是很少的,例如,人员的表性表,在查询结果中,一个大比例的表,这是数据行的结果集帐户的数据行,数据行需要在表中搜索所占的比例非常大。添加索引不加快检索速度明显。
定义为文本、图像和位数据类型的列不应该被索引。这是因为这些列的数据要么非常大,要么值很小。
当修改后的性能远远大于检索性能时,不应创建索引,这是因为修改性能和检索性能是相互矛盾的。
如果表数据很小,比如每个省市做一个汇总表,一般不到2000个,而且数据量基本不变。此时,增加索引不利于查询性能,但它会极大地影响更新的性能。
当加入索引,检索的性能得到了改善,但改性性能会降低。当指数降低,提高了性能,降低了检索的性能。因此,一个指标不应该被创建时对性能的要求远远大于检索性能。
4.3。联合索引
在特定的查询中,联合索引的效果比多个单一索引的效果要高,因为MySQL只有在使用多个索引时才能使用其中一个索引。
在查询中,前几名包括在联合指标将用于关节指数,另有部分或不使用将被使用。例如,我们有一个多柱指数在FirstName、LastName和年龄列,我们称之为fname_lname_age.when搜索条件是以下列组合,MySQL将使用fname_lname_age指数:
名字,姓氏,年龄
名、姓
名
另一方面,它相当于索引的建立(firstName、lastName,年龄),(firstName、lastName)和(名)对这些组合。
4.4。索引的长度
对于CHAR或VARCHAR列,该指数可以参与创建的列的一部分的一个指标,根据数据的分布。
创建t_main指数idx_t_main(名称(3));
这里是指定参与索引的名称的前三个字符,而不是全部。
的最大允许长度是1000个字节,和已经是500个汉字GBK编码
5。特殊领域
5.1。冗余字段
如果使用大表查询经常连接到基表,数据基本上是相同的,如姓名、城市名称等。一旦基础表发生变化,您需要更新所涉及的所有冗余表。
5.2。分区域
如果一个字段的一部分经常检索和汇总(substring()),可以考虑这部分独立。
例如,在一个统计名称中,每个姓氏的数量可以认为是根据名称和名称保存的,而不是字段。
它也是一些上下层次的实现,你也可以考虑把不同的层次放在不同的领域。
5.3。BLOB和CLOB
这样的字段拥有大量的数据,这表明数据库可以被设计为只保存其外部连接,并且数据以其他方式保存,例如系统文件。
6。特殊的
6.1。表分区
如果表中有许多列,但通常没有许多列参与查询和摘要,现在可以分成2个表,一个是常用字段,另一个是很少使用的字段。
6.2。使用非事务表类型
MySQL支持多表类型,在InnoDB类型支持,和MyISAM类型不支持,但MyISAM更快。对于某些数据,如地理行政区划,和那些不可能参与交易,我们可以考虑对MyISAM类型的表。
InnoDB表,但不会在MyISAM表数据的外部键约束。
MyISAM表参与交易,其InnoDB表可以正常提交和回滚,但不影响MyISAM表。