mysql优化where子句

发布时间:2025-08-13 17:31

使用简单易懂的句子结构,避免长难句 #生活技巧# #自我提升技巧# #写作表达优化#

3.1:删除不必要的括号:

    ((a AND b) AND c OR (((a AND b) AND (a AND d))))>(a AND b AND c) OR (a AND b AND c AND d)

    3.2: 使用常数

    (ab>5 AND b=c AND a=5

    3.3: 删除常数条件

    (b>=5 AND b=5) OR (b=6 AND 5=5) OR (b=100 AND 2=3) >b=5 OR b=6

    3.4: 索引使用的常数表达式仅计算一次

    3.5:在一个表中,没有一个 where 的 count (*) 直接从表中检索信息

    3.6: 所有常数的表在查询中在任何其他表之前读出

    3.7: 对外联结表最好联结组合是尝试了所有可能性找到的

    3.8:如果有一个 order by 字句和一个不同的 group by 子句或者 order by 或者 group by 包含不是来自联结的第一个表的列,那么创建一个临时表

    3.9: 如果使用了 sql_small_result,那么 msyql 使用在内存中的一个表

    3.10: 每个表的索引给查询并且使用跨越少于30%的行的索引.

    3.11 在每个记录输出前,跳过不匹配 having 子句的行

    4:优化 left join

    在 mysql 中 a left join b 按以下方式实现

    a:表 b 依赖于表 a 

    b:表 a 依赖于所有用在 left join 条件的表(除了 b)

    c:所有 left join 条件被移到 where 子句中

    d:进行所有的联结优化,除了一个表总是在所有他依赖的表后读取.如果有一个循环依赖,那么将发生错误

    e:进行所有的标准的 where 优化 f:如果在 a 中有一行匹配 where 子句,但是在 b 中没有任何匹配 left join 条件,那么,在 b 中生成的所有设置为NULL的一行

    g:如果使用 left join 来找出某些表中不存在的行并且在 where 部分有 column_name IS NULL 测试 (column_name 为 NOT NULL 列).那么,mysql 在它已经找到了匹配 left join 条件的一行后,将停止在更多的行后寻找

    5:优化 limit

    a:如果用 limit 只选择一行,当 mysql 需要扫描整个表时,它的作用相当于索引

    b:如果使用 limit#与 order by,mysql 如果找到了第#行,将结束排序,而不会排序正个表

    c:当结合 limit#和 distinct 时,mysql 如果找到了第#行,将停止

    d:只要 mysql 已经发送了第一个#行到客户,mysql 将放弃查询

    e:limit 0 一直会很快的返回一个空集合.

    f:临时表的大小使用 limit#计算需要多少空间来解决查询

    6:优化 insert

    插入一条记录的是由以下构成:

    a: 连接(3)

    b: 发送查询给服务器(2)

    c: 分析查询(2)

    d: 插入记录(1* 记录大小)

    e:插入索引(1* 索引)

    f:关闭(1)

    以上数字可以看成和总时间成比例

    改善插入速度的一些方法:

    6.1:如果同时从一个连接插入许多行,使用多个值的 insert,这比用多个语句要快

    6.2:如果从不同连接插入很多行,使用 insert delayed 语句速度更快

    6.3: 用 myisam,如果在表中没有删除的行,能在 select:s 正在运行的同时插入行

    6.4: 当从一个文本文件装载一个表时,用 load data infile.这个通常比 insert 快 20 倍

    6.5: 可以锁定表然后插入--主要的速度差别是在所有 insert 语句完成后,索引缓冲区仅被存入到硬盘一次.一般与有不同的 insert 语句那样多次存入要快.如果能用一个单个语句插入所有的行,锁定就不需要.锁定也降低连接的整体时间.但是对某些线程最大等待时间将上升.例如:

    thread 1 does 1000 inserts

    thread 2,3 and 4 does 1 insert

    thread 5 does 1000 inserts

    如果不使用锁定,2,3,4将在1和5之前完成.如果使用锁定,2,3,4,将可能在1和5之后完成.但是整体时间应该快40%.因为 insert,update,delete 操作在 mysql 中是很快的,通过为多于大约5次连续不断的插入或更新一行的东西加锁,将获得更好的整体性能.如果做很多一行的插入,可以做一个 lock tables,偶尔随后做一个 unlock tables(大约每1000行)以允许另外的线程存取表.这仍然将导致获得好的性能.load data infile 对装载数据仍然是很快的.

    为了对 load data infile 和 insert 得到一些更快的速度,扩大关键字缓冲区.

网址:mysql优化where子句 https://www.yuejiaxmz.com/news/view/1232277

相关内容

mysql 自关联;MySQL自关联优化技巧
MySQL慢查询优化
一份平民化的MySQL性能优化指南
MySql更新优化策略
MySQL性能优化技巧
MySQL大表优化方案
MySQL 性能优化神器 Explain 使用分析
MySQL索引原理及慢查询优化(转载)
MySQL优化十条技巧提速不止十倍
MySQL 查询优化:提速查询效率的13大秘籍(避免使用SELECT *、分页查询的优化、合理使用连接、子查询的优化)(上)

随便看看