## 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
~~~