mysql优化建议
2015-09-25 10:18
519 查看
1. 创建
每张表上的索引不应多于6个,索引越多在插入删除时越慢,而且索引会占用很大的磁盘空间。
尽量避免使用text, blog, clob大对象大文本的数据类型,空间占取大,而且索引失效。
考虑在经常做为where及order by列上加索引。
不要在列值可能为null上列上建索引。
索引字段的空间占取要尽可能的小。
若只含数值信息的字段尽量不要设计为字符型,尽量使用数字型字段
2. SQL编写
使用explain查询执行计划看应该用到的索引有没有用到,如果在查询列上加了索引但是在执行计划中看到该索引没有用到那么再根据以下建议调整SQL确保能用到萦引。
select语句中尽量减少使用select *;多表连接情况下,请给表取别名,并在查询的字段中明确表名。
使用子查询嵌套不要超过3层。
尽量不要使用子查询作为连接的表使用。
在查询集合较大的情况下如果进行集合查询使用[not] exists 关键字,在查询钱要尝试 [not] in 和 [not] exists 的效率。
避免在where子句中使用null判断、<>和!= 操作符会导致索引失效,并且会进行全表扫描。
避免在where子句中使用函数和表达式,会导致索引失效,函数和表达式可以放在=号的右边进行处理。
当只要一行数据时加Limit 1,这样MySQL数据库引擎会在找到一条数据后停止搜索,而不是继续往后查少下一条符合记录的数据。
应该尽量避免在where子句中用前置模糊查询(select id from t where name like ‘%李’), 这样即便name列有索引也会失效,进行全表扫描。
在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。
在多表联合场景中,尽量使用inner join,避免使用Left join 和 right join,在on子句中可能多的添加连接条件。
尽量使用连接来代替子查询 ???
4000
日期和时间数据类型
数字类型
字符串类型
每张表上的索引不应多于6个,索引越多在插入删除时越慢,而且索引会占用很大的磁盘空间。
尽量避免使用text, blog, clob大对象大文本的数据类型,空间占取大,而且索引失效。
考虑在经常做为where及order by列上加索引。
不要在列值可能为null上列上建索引。
索引字段的空间占取要尽可能的小。
若只含数值信息的字段尽量不要设计为字符型,尽量使用数字型字段
2. SQL编写
使用explain查询执行计划看应该用到的索引有没有用到,如果在查询列上加了索引但是在执行计划中看到该索引没有用到那么再根据以下建议调整SQL确保能用到萦引。
select语句中尽量减少使用select *;多表连接情况下,请给表取别名,并在查询的字段中明确表名。
使用子查询嵌套不要超过3层。
尽量不要使用子查询作为连接的表使用。
在查询集合较大的情况下如果进行集合查询使用[not] exists 关键字,在查询钱要尝试 [not] in 和 [not] exists 的效率。
避免在where子句中使用null判断、<>和!= 操作符会导致索引失效,并且会进行全表扫描。
避免在where子句中使用函数和表达式,会导致索引失效,函数和表达式可以放在=号的右边进行处理。
当只要一行数据时加Limit 1,这样MySQL数据库引擎会在找到一条数据后停止搜索,而不是继续往后查少下一条符合记录的数据。
应该尽量避免在where子句中用前置模糊查询(select id from t where name like ‘%李’), 这样即便name列有索引也会失效,进行全表扫描。
在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。
在多表联合场景中,尽量使用inner join,避免使用Left join 和 right join,在on子句中可能多的添加连接条件。
尽量使用连接来代替子查询 ???
4000
附表
mysql字段类型日期和时间数据类型
数据类型 | 含义 |
---|---|
date | 3字节,日期,格式:2014-09-18 |
time | 3字节,时间,格式:08:42:30 |
datetime | 8字节,日期时间,格式:2014-09-18 08:42:30 |
timestamp | 4字节,自动存储记录修改的时间 |
year | 1字节,年份 |
数据类型 | 含义 |
---|---|
tinyint | 1字节,范围(-128~127) |
smallint | 2字节,范围(-32768~32767) |
mediumint | 3字节,范围(-8388608~8388607) |
int | 4字节,范围(-2147483648~2147483647) |
bigint | 8字节,范围(+-9.22*10的18次方) |
数据类型 | 含义 |
---|---|
float(m, d) | 4字节,单精度浮点型,m总个数,d小数位 |
double(m, d) | 8字节,双精度浮点型,m总个数,d小数位 |
decimal(m, d) | decimal是存储为字符串的浮点数 |
数据类型 | 含义 |
---|---|
char(n) | 固定长度,最多255个字符 |
varchar(n) | 可变长度,最多65535个字符 |
tinytext | 可变长度,最多255个字符 |
text | 可变长度,最多65535个字符 |
mediumtext | 可变长度,最多2的24次方-1个字符 |
longtext | 可变长度,最多2的32次方-1个字符 |
相关文章推荐
- MySQL中的integer 数据类型
- MySQL存储过程
- mysql中int、bigint、smallint 和 tinyint的区别与长度
- mysql load data 导出、导入 csv
- source命令执行SQL脚本文件
- MySQL创建用户及权限控制
- MySQL管理数据表
- linux下mysql添加用户
- mysql procedure
- mysql触发器
- MySQL 备份和恢复策略
- mac下安装mysql(转载)
- mysql 修改编码 Linux/Mac/Unix/通用(杜绝修改后无法启动的情况!)
- MySQL数据的导出、导入(mysql内部命令:mysqldump、mysql)
- mysql数据行转列
- Linux下修改MySQL编码的方法
- MySQL Server 日志
- MySQL 安全事宜
- MySQL 备份与恢复