【刷题】面筋-数据库-mysql的优化
MySQL优化
1. 避免使用 select *
- 你需要什么信息,就查询什么信息,查询的多了,查询的速度肯定就会慢
2. 当你只需要查询出一条数据的时候,要使用 limit 1
- 比如你要查询数据中是否有男生,只要查询一条含有男生的记录就行了,后面不需要再查了,使用Limit 1 可以在找到一条数据后停止搜索
3. 建立高性能的索引
- 索引不是随便加的也不是索引越多越好,更不是所有索引对查询都有效
4. 建数据库表时,给字段设置固定合适的大小.
- 字段不能设置的太大,设置太大就造成浪费,会使查询速度变慢
5. 要尽量使用not null
6. EXPLAIN 你的 SELECT 查询
- 使用EXPLAIN,可以帮助你更了解MySQL是如何处理你的sql语句的, 你可以查看到sql的执行计划,这样你就能更好的去了解你的sql语句的不足,然后优化语句.
7. 在Join表的时候,被用来Join的字段,应该是相同的类型的,且字段应该是被建过索引的,这样,MySQL内部会启动为你优化Join的SQL语句的机制。
8. 如果你有一个字段,比如“性别”,“国家”,“民族”, “省份”,“状态”或“部门”,这些字段的取值是有限而且固定的,那么,应该使用 ENUM 而不是 VARCHAR。
- 因为在MySQL中,ENUM类型被当作数值型数据来处理,而数值型数据被处理起来的速度要比文本类型快得多。这样,我们又可以提高数据库的性能。
9. 垂直分割
- 将常用和有关系的字段放在相同的表中,把一张表的数据分成几张表
- 这样可以降低表的复杂度和字段的数目,从而达到优化的目的
10. 优化where查询
- ①. 避免在where子句中对字段进行表达式操作
比如: select 列 from 表 where age*2=36; 建议改成 select 列 from 表 where age=36/2;
-
②. 应尽量避免在 where 子句中使用 !=或<> 操作符,否则将引擎放弃使用索引而进行全表扫描。
-
③. 应尽量避免在 where 子句中对字段进行 null 值 判断
-
④. 应尽量避免在 where 子句中使用 or 来连接条件
11. 不建议使用%前缀模糊查询,这种查询会导致索引失效而进行全表扫描
- 例如LIKE “%name”或者LIKE “%name%这两种都是不建议的.但是可以使用LIKE “name%”。
- 对于LIKE “%name%,可以使用全文索引的形式
12. 要慎用in和 not in
- 例如:select id from t where num in(1,2,3) 建议改成 select id from t where num between 1 and 3
- 对于连续的数值,能用 between 就不要用 in 了
13. 理解in和exists, not in和not exists的区别
-
很多时候用 exists 代替 in 是一个好的选择:如查询语句使用了not in那么内外表都进行全表扫描,没用到索引,而not exists子查询依然能用到表上索引,所以无论哪个表大,用not exists都比not in要快。
- select num from a where num in(select num from b) -
建议改成: select num from a where exists(select 1 from b where num=a.num)
-
区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询。所以IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。
-
关于not in和not exists,推荐使用not exists,不仅仅是效率问题,not in可能存在逻辑问题
14. 理解select Count (*)和Select Count(1)以及Select Count(column)区别
-
一般情况下,Select Count (*)和Select Count(1)两着返回结果是一样的
-
假如表沒有主键(Primary key), 那么count(1)比count(*)快,
-
如果有主键的話,那主键作为count的条件时候count(主键)最快
-
如果你的表只有一个字段的话那count(*)就是最快的
-
count(*) 跟 count(1) 的结果一样,都包括对NULL的统计,而count(column) 是不包括NULL的统计
参考链接
END
相关文章
- 使用navicat premium将数据库从Oracle迁移到SQL Server,或从Oracle迁移到MySQL
- MySQL数据库优化总结
- MySQL 之【视图】【触发器】【存储过程】【函数】【事物】【数据库锁】【数据库备份】
- 查看mysql数据库版本方法总结
- MySQL数据库排序选择的作用和该如何选择编码格式
- MySQL--执行mysql脚本及其脚本编写
- MYSQL数据库数据拆分之分库分表总结
- mysql数据库的优化和查询效率的优化
- 【刷题】面筋-数据库-mysql的优化
- 【MySQL 提高】1. MySQL优化的总览, 数据库的基本原理和3NF的概念
- 更改MySQL数据库的编码为utf8mb4
- mysql数据库架构设计与优化
- paip.提高稳定性---自动检测sleep mysql数据库死连接以及kill
- MySQL数据库加密和解密~认证登陆密码(mysql.user)和MySQL不区分大小写
- 〖Python 数据库开发实战 - MySQL篇㉕〗- 数据更新操作 - UPDATE 语句
- 〖Python 数据库开发实战 - Python与MySQL交互篇③〗- MySQL Connector的事务控制与异常处理
- MySQL数据库开发的36条原则
- MYSQL导入数据报错|MYSQL导入超大文件报错|MYSQL导入大数据库报错:2006 - MySQL server has gone away
- python web py入门(11)- 双重查询访问MYSQL数据库出错
- 数据库MySQL基础入门之MySQL隐式转换
- MYSQL数据库连接
- MYSQL数据库篇之查看当前数据库的版本编号
- MySQL基础篇 | 存储引擎、事务、索引、视图、DBA命令、数据库设计三范式
- MySQL数据库性能优化由浅入深(表设计、慢查询、SQL索引优化、Explain分析、Show Profile分析、配置优化)
- 字段类型:mysql中int(3)与int(11)有什么区别吗?优化数据库字段占据磁盘的大小