1、对索引列运算,运算包括(+、-、*、/、!、<>、%、like'%_'(%放在前面)。2、类型错误,如字段类型为varchar,where条件用number。3、对索引应用内部函数,这种情况下应该建立基于函数的索引如select * from template t where ROUND(t.logicdb_id) = 1此时应该建ROUND(t.logicdb_id)为索引,mysql8.0开始支持函数索引,5.7可以通过虚拟列的方式来支持,之前只能新建一个ROUND(t.logicdb_id)列然后去维护。4、如果条件有or,即使其中有条件带索引也不会使用(这也是为什么建议少使用or的原因),如果想使用or,又想索引有效,只能将or条件中的每个列加上索引。5、如果列类型是字符串,那一定要在条件中数据使用引号,否则不使用索引。6、B-tree索引 is null不会走,is not null会走,位图索引 is null,is not null 都会走。7、组合索引遵循最左原则。
using filesort,using temporary这两项出现时需要注意下,这两项是十分耗费性能的,在使用group by的时候,虽然没有使用order by,如果没有索引,是可能同时出现using filesort,using temporary的,因为group by就是先排序在分组,如果没有排序的需要,可以加上一个order by NULL来避免排序,这样using filesort就会去除,能提升一点性能。
type字段
1、system: 表只有一行记录(等于系统表),这是const类型的特例,平时不会出现。2、const: 如果通过索引依次就找到了,const用于比较主键索引或者unique索引。因为只能匹配一行数据,所以很快。如果将主键置于where列表中,MySQL就能将该查询转换为一个常量。3、eq_ref: 唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描。4、ref: 非唯一性索引扫描,返回匹配某个单独值的所有行。本质上也是一种索引访问,它返回所有匹配 某个单独值的行,然而它可能会找到多个符合条件的行,所以它应该属于查找和扫描的混合体。5、range: 只检索给定范围的行,使用一个索引来选择行。key列显示使用了哪个索引,一般就是在你的where语句中出现between、、in等的查询,这种范围扫描索引比全表扫描要好,因为只需要开始于缩印的某一点,而结束于另一点,不用扫描全部索引。6、index: Full Index Scan ,index与ALL的区别为index类型只遍历索引树,这通常比ALL快,因为索引文件通常比数据文件小。(也就是说虽然ALL和index都是读全表, 但index是从索引中读取的,而ALL是从硬盘读取的)。7、all: Full Table Scan,遍历全表获得匹配的行。
1、如果有主键或者唯一键冲突则不插入: insert ignore into;2、如果有主键或者唯一键冲突则更新,注意这个会影响自增的增量: INSERT INTO room_remarks(room_id,room_remarks) VALUE(1,"sdf") ON DUPLICATE KEY UPDATE room_remarks="234";3、如果有就用新的替代,values如果不包含自增列,自增列的值会变化: REPLACE INTO room_remarks(room_id,room_remarks) VALUE(1,"sdf");4、备份表: CREATE TABLE user_info SELECT * FROM user_info;5、复制表结构: CREATE TABLE user_v2 LIKE user;6、从查询语句中导入: INSERT INTO user_v2 SELECT * FROM user或者INSERT INTO user_v2(id,num) SELECT id,num FROM user;7、连表更新: UPDATE user a, room b SET a.num=a.num+1 WHERE a.room_id=b.id;8、连表删除: DELETE user FROM user,black WHERE user.id=black.id;
锁相关(作为了解,很少用)
1、共享锁: select id from tb_test where id = 1 lock in share mode;
2、排它锁: select id from tb_test where id = 1 for update;
优化时用到:
1、强制使用某个索引: select * from table force index(idx_user) limit 2;
2、禁止使用某个索引:select * from table ignore index(idx_user) limit 2;3、禁用缓存(在测试时去除缓存的影响): select SQL_NO_CACHE from table limit 2;
2、聚合函数会自动滤空,比如a列的类型是int且全部是NULL,则SUM(a)返回的是NULL而不是0。3、mysql判断null相等不能用“a=null”,这个结果永远为UnKnown,where和having中,UnKnown永远被视为false,check约束中,UnKnown就会视为true来处理。所以要用“a is null”处理。 六、千万大表在线修改