mysql优化(第一部分)

一、设计局限和初衷

1、MyISAM存储引擎,MySQL使用极快速的表锁定,以便允许多次读或一次写。使用该存储引擎的最大问题出现在同一个表中进行混合稳定数据流更新与慢速选择。

2、为了更容易地让非事务表顺利工作,为所有NOT NULL列设置默认值。

3、不是运行在严格模式或TRADITIONAL SQL模式时,插入值会变为“最好可能值”。

4、所有表达式的计算结果返回一个表示错误状况的信号。例如,1/0返回NULL。(使用ERROR_FOR_DIVISION_BY_ZERO SQL模式可以更改该行为)。


二、为可移植性设计应用程序

1、因为不同SQL服务器实现了标准SQL的不同部分,需要花功夫来编写可移植的SQL应用程序。对很简单的选择/插入,很容易实现移植,但是需要的功能越多则越困难。如果想要应用程序对很多数据库系统都快,它变得更难。

2、MySQLcrash-me程序来找出能用于数据库服务器选择的函数、类型和限制。crash-me并不能找出所有的特性,但是其广度仍然很合理,可以进行大约450个测试。

3、前端使用缓存时,表创建信息应该包含缓存初始大小和表刷新频率等信息。


三、优化SELECT语句和其它查询

1、影响所有语句的一个因素是:你的许可设置得越复杂,所需要的开销越多。

2、执行GRANT语句时使用简单的许可,当客户执行语句时,可以使MySQL降低许可检查开销。例如,如果未授予任何表级或列级权限,服务器不需要检查tables_priv和columns_priv表的内容。同样地,如果不对任何 账户进行限制,服务器不需要对资源进行统计。如果查询量很高,可以花一些时间使用简化的授权结构来降低许可检查开销。

3、select benchmark(执行次数,表达式),例如:select benchmark(1000000,date_add(now(),interval 1 day));该语句执行的时间是date_add执行一百万次的时间。

4、explain语句:

(1)explain table_name:相当于desc tablename或show columns from table_name;

(2)用join链接多张表时,返回多行数据,且这些数据是以表被读入的顺序列出;多表的执行方式是,先从第一张表获取一条记录,在查找第二张表,接着第三张,可见多表联合查询速度很慢。

(3)当使用EXTENDED关键字时,EXPLAIN产生附加信息,可以用SHOW WARNINGS浏览。该信息显示优化器限定SELECT语句中的表和列名,重写并且执行优化规则后SELECT语句是什么样子。

(4)explain结果各列:

id:select标识符;

select_type:select类型,包含simple(不包含union和子查询)、primary、unoin(union语句第二个或后面的,取决于外查询)、union result(union结果)、subquery(子查询的第一个select)、dependent subquery(子查询的第一个select)、derived(导出表的sect,from子查询);

table:引用的表;

type:链接类型,包含system(只有一行,是const的特例)、const(只有一行常用于primary key 和unique)、eq_ref(简单的说,这是多表查询的const,也是用在primary key和unique)、ref(不只一行,比如:name='hehe',记录数可以有多条)、ref_or_null(包含or name is null 的ref)、index_merge(索引合并法)、unique_subquery(用于in子查询的primary key)、index_subquery(用于in子查询,非主键)、range(用于范围表达式,包括in、between等)、index(使用了普通索引)、all(全表扫描)共十一种;

possible_keys:能使用的索引;

key:实际使用的索引;

key_len:键长,通过key_len值我们可以确定MySQL将实际使用一个多部关键字的几个部分。

ref:ref列显示使用哪个列或常数与key一起从表中选择行;

rows:必须检查的行数;

Extra:解决查询的重要信息,包括Distinct(只匹配一行)、



四、优化语句:

1、怎么优化where字句:

(1)除去重叠的常量,如:a>b and a=c abd b=5应改为 a>5 and a=c and b=5;



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
针对 MySQL 的模糊查询性能优化,可以考虑以下几个方面: 1. 使用索引:为模糊查询的字段添加索引,可以大大提高查询速度。在模糊查询时,可以使用前缀索引来优化性能。例如,对于一个名为 name 的字段,可以添加一个前缀索引,如 INDEX idx_name (name(10))。 2. 避免在模糊查询中使用通配符开头:通配符开头的模糊查询(如 '%keyword')无法使用索引,会导致全表扫描。尽量避免使用通配符开头,或者考虑使用全文搜索引擎来处理此类需求。 3. 使用全文搜索引擎:MySQL 提供了全文搜索引擎(如 MySQL 的全文索引或第三方搜索引擎,如 Elasticsearch),可以更高效地处理模糊查询。全文搜索引擎可以根据关键词的相关性进行排序,并且支持更复杂的查询操作。 4. 限制查询结果集大小:如果你只需要查询结果中的部分数据,可以通过 LIMIT 关键字限制结果集的大小。这样可以减少查询的数据量,提高查询性能。 5. 数据库优化:定期进行数据库优化操作,包括索引重建、表优化以及统计信息更新等。这些操作可以提高查询性能,并减少模糊查询的执行时间。 6. 数据库分区:如果数据量较大,可以考虑将表进行分区。根据分区规则,可以将数据划分到不同的物理文件中,从而提高查询性能。 7. 使用缓存:对于频繁查询的模糊查询结果,可以考虑使用缓存来提高查询速度。将查询结果缓存在内存中,可以避免每次都进行数据库查询。 这些是一些常见的优化方法,具体的优化策略需要根据实际场景和需求来确定。同时,还可以通过分析慢查询日志、性能监控工具等来找到潜在的性能瓶颈,并进行相应的优化

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值