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子句中可能多的添加连接条件。
- <font color="red">尽量使用连接来代替子查询 ???</font>
附表
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个字符 |
网友评论