1. 避免使用 select *
SELECT*增加很多不必要的消耗(CPU、IO、内存、网络带宽);增加了使用覆盖索引的可能性;当表结构发生改变时,前断也需要更新。所以要求直接在select后面接上字段名;
2. 当你只需要查询出一条数据的时候,要使用 limit 1
比如你要查询数据中是否有男生,只要查询一条含有男生的记录就行了,后面不需要再查了,使用Limit 1 可以在找到一条数据后停止搜索;
3. 建立高性能的索引
- 索引是提高数据库性能的常用方法,它可以令数据库服务器以比没有索引快得多的速度检索特定的行;
- 索引不是随便加的也不是索引越多越好,更不是所有索引对查询都有效;
- 如果排序字段没有用到索引,就尽量少排序;
- 如果限制条件中其他字段没有索引,尽量少用or;
- 在Join表的时候,被用来Join的字段,应该是相同的类型的,且字段应该是被建过索引的,这样,MySQL内部会启动为你优化Join的SQL语句的机制;
- 必要时可以使用force index来强制查询走某个索引,有的时候MySQL优化器采取它认为合适的索引来检索SQL语句,但是可能它所采用的索引并不是我们想要的。这时就可以采用forceindex来强制优化器使用我们制定的索引。
4. 建数据库表时,给字段设置固定合适的大小
字段不能设置的太大,设置太大就造成浪费,会使查询速度变慢;
5. 要尽量使用not null
6. EXPLAIN 你的 SELECT 查询
使用EXPLAIN,可以帮助你更了解MySQL是如何处理你的sql语句的, 你可以查看到sql的执行计划,这样你就能更好的去了解你的sql语句的不足,然后优化语句;
- type列,连接类型。一个好的SQL语句至少要达到range级别。杜绝出现all级别。
- key列,使用到的索引名。如果没有选择索引,值是NULL。可以采取强制索引方式。
- key_len列,索引长度。
- rows列,扫描行数。该值是个预估值。
- extra列,详细说明。注意,常见的不太友好的值,如下:Using filesort,Using temporary。
7. 关于Joint
1)MySQL中没有full join,可以用以下方式来解决:
select * from A left join B on B.name = A.name where B.name is null union all select * from B;
2)尽量使用inner join,避免left join:
参与联合查询的表至少为2张表,一般都存在大小之分。如果连接方式是inner join,在没有其他过滤条件的情况下MySQL会自动选择小表作为驱动表,但是left join在驱动表的选择上遵循的是左边驱动右边的原则,即left join左边的表名为驱动表;
3)合理利用索引:
被驱动表的索引字段作为on的限制字段;
4)利用小表去驱动大表: