## 1、设置pager **设置pager**:将mysql的执行结果快速原样保存到服务器文件 ~~~ pager cat > /data/webroot/XXX/testMysql.csv ; #设置pager nopager ; #取消pager ~~~ ## 2、mysql当前进程数 ~~~ 可用作紧急处理: (1)当mysql query数满了, (2)或者 慢查询导致大片的query 处于等待 紧急处理可以杀死query,先让系统不至于崩溃。 **注意**:只是紧急处理,需要排查是具体哪里导致的问题,从根源解决 ~~~ ~~~ show processlist \G;#查询当前的query kill '第一列的数字' ; #杀死该查询 ~~~ ## 3、case ~~~ select id, case tableName.fieldName when '0' then '情况1' when '2' then '情况2' when '3' then '情况3' end as fieldName from `tableName` ~~~ ## 4、引擎 MyISAM: ~~~ Select更优 不支持事务 只支持表锁 不支持外键 支持FULLTEXT全文索引 ~~~ InnoDB: ~~~ 支持事务 Inset、update、delete更优 支持表锁、行锁 支持外键 不支持全文索引 ~~~ ~~~ 觉得使用InnoDB可以应对更为复杂的情况,特别是对并发的处理要比MyISAM高效。同时结合memcache也可以缓存SELECT来减少SELECT查询,从而提高整体性能。 ~~~ ## 5、千万级select 五千万及以上,取全量、或者取某页,直接用limit 会很慢 ~~~ 1、主键是连续的,直接计算出来,直接limit 2、主键是非连续的,可以考虑先找出ID ID是主键索引,查询很快 先找ID,然后用in `select id from table order by id limit 50000,10;` `SELECT * FROM table WHERE id IN(XXX, XXX, XXX...);` 3、加新表维护页数 4、体验降级 过大的页数提示没数据 5、复合索引 select 索引 ~~~ ~~~ 主键,是一种特殊的唯一索引,在一张表中只能定义一个主键索引,主键用于唯一标识一条 记录,使用关键字 PRIMARY KEY 来创建。 索引可以覆盖多个数据列,就是联合索引。 联合主键,就是多个主键联合形成一个主键组合,体现在联合。 索引可以极大的提高数据的查询速度,但是会降低插入、删除、更新表的速度,因为在执行 写操作时,还要操作索引文件 ~~~ ## 6、锁 ~~~ ## **共享锁与排他锁** * 共享锁(读锁):其他事务可以读,但不能写。 * 排他锁(写锁) :其他事务不能读取,也不能写。 ## **粒度锁** * MyISAM 和 MEMORY 存储引擎采用的是表级锁(table-level locking) * InnoDB 存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。 默认情况下,表锁和行锁都是自动获得的, 不需要额外的命令。 但是在有的情况下, 用户需要明确地进行锁表或者进行事务的控制, 以便确保整个事务的完整性,这样就需要使用事务控制和锁定语句来完成。 ~~~ ~~~ * 表级锁: 开销小,加锁快;不会出现死锁; 锁定粒度大,发生锁冲突的概率最高,并发度最低。 更适合于以查询为主,并发用户少, * 行级锁: 开销大,加锁慢;会出现死锁; 锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 最大程度的支持并发,同时也带来了最大的锁开销。 ~~~ ~~~ ## **MyISAM加表锁方法:** 执行查询语句(SELECT)前,会自动给涉及的表加读锁, 在执行更新操作 (UPDATE、DELETE、INSERT 等)前,会自动给涉及的表加写锁,这个过程并不需要用户干预, ## **InnoDB加锁方法:** * 对于 UPDATE、 DELETE 和 INSERT 语句, InnoDB 会自动给涉及数据集加排他锁(X); * 对于普通 SELECT 语句,InnoDB 不会加任何锁; 事务可以通过语句显式加共享锁或排他锁: * 共享锁(S):SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE。 * 排他锁(X):SELECT * FROM table_name WHERE ... FOR UPDATE。 ~~~ ## 7 、sql注入 ~~~ 防护 1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和 双"-"进行转换等。 2.永远不要使用动态拼装 sql,可以使用参数化的 sql 3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。 4.不要把机密信息直接存放,加密或者 hash 掉密码和敏感的信息。 5.应用的异常信息应该给出尽可能少的提示示,最好使用自定义的错误信息对原始错误信息进行包装 6.sql 注入检测 ~~~ ~~~ **PHP怎样防止SQL注入?** 使用预处理语句和参数化查询。预处理语句和参数分别发送到数据库服务器进行解析,参数将会被当作普通字符处理。 ~~~ ### 长度 ~~~ TINYINT——这个类型最多可容纳三位数。 ·SMALLINT——最多可容纳五位数。 ·MEDIUMINT——最多可容纳八位数。 ·INT——可以容纳十位数。 ·BIGINT——最多可容纳二十位数。 ~~~ ### 复合索引 ~~~ 最左原则:只要包含最左边的一列即可, userId, mobile, billMonth三个字段添加上联合索引! 1.查询条件为 userid 联合索引有效 2.查询条件为 mobile 联合索引无效 3.查询条件为 billMonth 联合索引无效 4.查询条件为 userid and mobile 联合索引有效 5.查询条件为 mobile and userid 联合索引依旧有效 6.查询条件为 userid or mobile 把 and 换成 or,发现联合所索引无效! 7.查询条件为 userid and billMonth 第一和第三,测试联合索引依旧有效! 8.查询条件为 mobile and billMonth 第二和第三,发现联合索引无效! 9.查询条件为 userid and mobile and billMonth 所有条件一起查询,联合索引有效! 原文:https://blog.csdn.net/Abysscarry/article/details/80792876 ~~~