以下是我个人对数据库优化方面的见解:
一. 数据库引擎的选择
选对一个适合的引擎对数据库意义重大
Innodb擅长增删改,支持事务和外键,有行锁表锁,但不支持全文索引,
MyISAM擅长查,支持全文索引而且因为使用时间长相对稳定一些
对于不需要频繁更改插入的数据来说,使用MyISAM比较好一些,因为他可以做很多count计算和擅长查 如用户表因为注册和更改的相对少一些而很多地方都需要查询用户信息
二. 选择合适的字段属性
1. 多使用 enum 因为它是数值类型查询起来比字串快一些
而varchar和char 在字串长度确定的情况下使用定长char 这会在执行sql语句时不需要计算char所占长度所以相对快一些而一般太长的可以使用text字段类似还有很多
三. 加索引
1. 主键索引
alert table tablename add primary key (`字段名`)
主键是一种唯一性索引,但它必须指定为PRIMARY KEY
,每个表只能有一个主键。
2. 唯一索引
alter table table_name add primary key (`字段名`);
索引列的所有值都只能出现一次,即必须唯一
,值可以为空
。
3. 普通索引
alter table table_name add index (`字段名`);
基本
的索引类型,值可以为空,没有唯一性的限制。
4. 全文索引
alter table 表名 add FULLTEXT(`字段名`);
全文索引的索引类型为FULLTEXT
。全文索引可以在varchar、char、text
类型的列上创建。可以通过ALTER TABLE
或CREATE INDEX命令创建。对于大规模的数据集,通过ALTER TABLE(或者CREATE INDEX)命令创建全文索引要比把记录插入带有全文索引的空表更快。MyISAM
支持全文索引,InnoDB
在mysql5.6之后支持了全文索引
。
全文索引不支持中文
需要借sphinx(coreseek)
或迅搜<、code>技术处理中文。
四. 使用连接join来代替子查询 (sub-queries)
这个技术可以使用select语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在
这个技术可以使用SELECT语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查询中。
五. 使用联合union来代替手动创建的临时表
它可以把需要使用临时表的两条或更多的select查询合并的一个查询中。在客户端的查询会话结束的时候,临时表会被自动删除,从而保证数据库整齐、高效。使用union来创建查询的时候,我们只需要用UNION作为关键字把多个select语句连接起来就可以了,要注意的是所有select语句中的字段数目要想同。下面的例子就演示了一个使用UNION的查询。
六. 读写分离 主从复制
七. 分库分表
八. 缓存数据