一、建表原则:
1、表的优化与类型选择
(1)定长与变长相分离。
(2)根据使用频率建立主表及副表(将不常用的字段放入副表中:比如用户表,将用户家庭地址等详细信息放入附表,当需要查询详情,再点击查询)。
(3)在满足数据库“三范式”的前提下,采用“反三范式”,合理加入冗余字段。该思路是以空间换时间,比如减少频繁求和、频繁级联等,保证系统性能。
2、列选择(数据类型选择)
(1)字段类型选择:整型>date,time>enum、char>varchar>blob、text。
(2)对于整型和char型,优先选择整型,比如采用整型或字符型表示性别时,优先选择tinyint型,因为选择char(1)可能会考虑到字符集和校对集。
(3)enum:内部采用整型存储,起到约束的作用。
(4)char与varchar:char定长,varchar不定长,虽然varchar会比char省空间,但是由于修改时会根据长度不同,会引起‘行迁移’(Row Migration)现象,而这造成多余的I/O,是数据库设计和调整中要尽力避免的,所以对于频繁修改的数据尽量使用char代替varchar,以确保性能。
二、索引优化(核心):
索引可以提高查询、排序、以及分组速度。
1、 索引分类:betree索引、hash索引。
(1)Betree索引:一个树形结构索引,页节点记录指向数据的信息,快速定位数据。
(2)Hash索引:运行在内存中,只能在memory表中使用。在磁盘中给一个空间,通过复杂运算获取磁盘的地址,当获取数据时再利用函数运算,直接获取地址拿到数据,直接命中查询速度快。
Hash索引缺点缺点:
1)可能会存在地址冲突:采用拉链算法解决。
2)随机地址,磁盘空洞。
3)范围查询无法优化。因为地址是随机的,所以无法范围优化。
4)无法运用前缀索引(利用到建立索引字段的一部分),排序无法优化。因为需要回行拿数据。
2、索引类型:独立索引、联合索引
(1)联合索引是多个列联合起来加上同一索引,列顺序区分,即满足“左前缀”要求,从左到右依次满足,若中间有断裂,则后边的不能利用。
3、索引创建:
(1)普通索引
这是最基本的索引,它没有任何限制。
创建索引:
CREATE INDEX indexName ON mytable(username(length));如果是CHAR VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length,下同。
删除索引:
DROP INDEX [indexName] ON mytable;
(2)唯一索引
它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。
创建索引:
CREATE UNIQUE INDEX indexName ON mytable(username(length));
(3)主键索引
它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引:
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, PRIMARY KEY(ID) );
3、betree索引分类:根据引擎不同分为聚簇索引和非聚簇索引
(1)非聚簇索引(myisam引擎 ):索引树和数据分开,只在叶节点下放索引值以及指向行数据的引用。
(2)聚簇索引(innodb引擎):聚簇索引是对磁盘上实际数据重新组织以按指定的一个或多个列的值排序的算法。特点是存储数据的顺序和索引顺序一致。既存储索引值又存储行数据(数据放在主键索引下,若无主键索引则放在非空索引下,若无非空索引则直接在内部创建一个row存放行数据),不用回行获取数据。该索引次级索引指向对主键索引的引用。
聚簇索引好处:不用回行,快速获取数据;缺点:若数据不规则则会造成页分裂(数据大,主键索引不规则)。
4、索引覆盖:如果索引中已经包含所查询的字段,则不用回行,直接从索引值获取数据,称为索引覆盖。若索引中字段不完全包含所查询的字段,则要回行。
5、索引建立原则:命中频繁、区分度高、长度小、尽量覆盖常用查询字段。
一般在实际工作中,可以根据调研,及运行日志,统计数据,进行索引建立。
7.对于左前缀区分度不高的字段(比如地址https://www.cnblogs.com,中的:“https://www.”):采用倒序、伪哈希等方法。
伪哈希:新增一个字段,利用crc32算法(哈希算法)将,需要建立索引的字段算成一个整数,然后给整数加索引,然后查询的时候给需要查询的数据先采用crc32计算,然后查询crc32字段的数据。
8.索引与排序:需要排序的字段尽量与索引一致,索引本来是有序的,而且在所索引上排序速度加快。
9.重复索引与冗余索引:
(1)重复索引:两个索引完全相同:无意义。
(2)冗余索引:两个索引有交叉的地方。
三、SQL语句优化
1、sql语句花费时间:等待时间与执行时间(查找、取出、传输少)。
(1)按数据拆分成多次查询,比如分页查询。
(2)按索引查、排序、分组,数据最好可以走索引覆盖。
(3)对不要求绝对精准的数据,可不精确查询,
(4)传输:避免在数据查询中使用select * 查询,需要哪些字段,就查那些字段。
2、sql语句性能判别:采用Explain对sql语句进行解释:
Id:
Select_type:
Table:
Type: all 、index、range、ref(引用)、const(常量)、system、null
Ref(引用):
Extra:
四、limit优化;
1、业务解决:翻页页数限制
2、技术解决:先沿着索引,获得符合条件的id,然后根据id查询。