在设计Mysql商品多特征数据库时,我们可以采用类似“键值对”的方式进行存储。具体而言,我们可以设计以下两个表:
1 商品表
商品ID 商品名称
1 商品1
2 商品2
3 商品3
请点击输入图片描述
这样,我们可以在商品表中存储每个商品的基本信息,而在特征表中存储每个商品的特定特征。对于查询特定特征的商品,我们可以使用如下的SQL语句:
SELECT 商品表.商品名称
FROM 商品表
INNER JOIN 特征表 ON 商品表.商品ID = 特征表.商品ID
WHERE 特征表.特征名称 = '风格' AND 特征表.特征值 = '新中式'
这个SQL查询语句会返回所有风格为“新中式”的商品名称。我们可以根据需要修改特征名称和特征值来查询不同的特定特征商品。
Log File物理结构
从 ib_logfile0和 ib_logfile1这两个文件的物理结构可以看出,在Log Header部分还是有些许差异的, ib_logfile0会多一些额外的信息,主要是checkpoint信息。
并且每个Block的单位是512字节,对应到磁盘每个扇区也是512字节,因此redo log写磁盘是原子写,保证能够写成功,而不像index page一样需要double write来保证安全写入。
我们依次从上到下来看每个Block的结构
Log File Header Block
Log Goup ID,可能会配置多个redo组,每个组对应一个id,当前都是0,占用4字节
Start LSN,这个redo log文件开始日志的lsn,占用8字节
Log File Number,总是为0,占用4字节
Created By,备份程序所占用的字节数,占用32字节
另外在ib_logfile0中会有两个checkpoint block,分别是 LOG_CHECKPOINT_1/ LOG_CHECKPOINT_2,两个记录InnoDB Checkpoint信息的字段,分别从文件头的第二个和第四个block开始记录,并且只在每组log的第一个文件中存在,组内其他文件虽然没有checkpoint相关信息,但是也会预留相应的空间出来。这里为什么有两个checkpoint的呢?原因是设计为交替写入,避免因为介质失败而导致无法找到可用的checkpoint的情况。
Log blocks
请点击输入图片描述
log block结构分为日志头段、日志记录、日志尾部
Block Header,占用12字节
Data部分
Block tailer,占用4字节
Block Header
这个部分是每个Block的头部,主要记录的块的信息
Block Number,表示这是第几个block,占用4字节,是通过LSN计算得来的,占用4字节
Block data len,表示该block中有多少字节已经被使用了,占用2字节
First Rec offet,表示该block中作为第一个新的mtr开始的偏移量,占用2字节
Checkpoint number,表示该log block最后被写入时的检查点的值,占用4字节
•VARCHAR和CHAR类型,varchar是变长的,需要额外的1-2个字节存储,能节约空间,可能会对性能有帮助。但由于是变长,可能发生碎片,如更新数据;•使用ENUM代替字符串类型,数据实际存储为整型。
•字符串类型
•要尽可能地避免使用字符串来做标识符,因为它们占用了很多空间并且通常比整数类型要慢。特别注意不要在MYISAM表上使用字符串标识符。MYISAM默认情况下为字符串使用了压缩索引(Packed Index),这使查找更为缓慢。据测试,使用了压缩索引的MYISAM表性能要慢6倍。
•还要特别注意完全‘随机’的字符串,例如由MD5()、SHA1()、UUID()产生的。它们产生的每一个新值都会被任意地保存在很大的空间范围内,这会减慢INSERT及一些SELECT查询。1)它们会减慢INSERT查询,因为插入的值会被随机地放入索引中。这会导致分页、随机磁盘访问及聚集存储引擎上的聚集索引碎片。2)它们会减慢SELECT查询,因为逻辑上相邻的行会分布在磁盘和内存中的各个地方。3)随机值导致缓存对所有类型的查询性能都很差,因为它们会使缓存赖以工作的访问局部性失效。如果整个数据集都变得同样“热”的时候,那么把特定部分的数据缓存到内存中就没有任何的优势了。并且如果工作集不能被装入内存中,缓存就会进行很多刷写的工作,并且会导致很多缓存未命中。
•如果保存UUID值,就应该移除其中的短横线,更好的办法是使用UHEX()把UUID值转化为16字节的数字,并把它保存在BINARY(16)列中。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)