1、mysql默认的事务隔离级别为repeatable-read,可重复读

2、在事务进行当中,只有SELECT ... FOR UPDATE 或LOCK IN SHARE MODE 同一笔数据时会等待其它事务结束后才执行,一般SELECT ... 则不受此影响。

例于 

SELECT num FROM products WHERE id=3 FOR UPDATE;当并发扣商品数量时,保证num值不会被修改
或者在修改时后面带上之前查询的结果
比如,查询到uid=1,money=100,
当要扣钱时,这个时候,其他事务也进来了,并且先执行完毕,扣走了50元,所以这个时候sql这样写就没问题
update user set money=money-10 where uid=1 and money=100

3、mysql存储过程
但是在高并发时,建议少用,逻辑的出来还是交给程序来做,这样更快。
4、case``````````when`````````,用一条语句,批量修改当条件不同时,修改的数据不一样。
 
CASE sex 
         WHEN '1' THEN '男' 
         WHEN '2' THEN '女' 
ELSE '其他' END 
例:
一,已知数据按照另外一种方式进行分组,分析。 

有如下数据:(为了看得更清楚,我并没有使用国家代码,而是直接用国家名作为Primary Key) 
国家(country) 人口(population) 
中国 600 
美国 100 
加拿大 100 
英国 200 
法国 300 
日本 250 
德国 200 
墨西哥 50 
印度 250 

根据这个国家人口数据,统计亚洲和北美洲的人口数量。应该得到下面这个结果。 
洲 人口 
亚洲 1100 
北美洲 250 
其他 700 

想要解决这个问题,你会怎么做?生成一个带有洲Code的View,是一个解决方法,但是这样很难动态的改变统计的方式。 
如果使用Case函数,SQL代码如下: 
SELECT  SUM(population), 
        CASE country 
                WHEN '中国'     THEN '亚洲' 
                WHEN '印度'     THEN '亚洲' 
                WHEN '日本'     THEN '亚洲' 
                WHEN '美国'     THEN '北美洲' 
                WHEN '加拿大'  THEN '北美洲' 
                WHEN '墨西哥'  THEN '北美洲' 
        ELSE '其他' END 
FROM    Table_A 
GROUP BY CASE country 
                WHEN '中国'     THEN '亚洲' 
                WHEN '印度'     THEN '亚洲' 
                WHEN '日本'     THEN '亚洲' 
                WHEN '美国'     THEN '北美洲' 
                WHEN '加拿大'  THEN '北美洲' 
                WHEN '墨西哥'  THEN '北美洲' 
        ELSE '其他' END; 

  update 语句时,也可以用case ````````````when```````then.

UPDATE SomeTable 
SET p_key = CASE WHEN p_key = 'a' 
THEN 'b' 
WHEN p_key = 'b' 
THEN 'a' 
ELSE p_key END 
WHERE p_key IN ('a', 'b'); 

  

4、mysql官方中间件,msyql-proxy,

   作用有以下:

  • sql拦截与修改

  • 性能分析与监控

  • 读写分离

  • 请求路由

 

5、

(1)explain结果中的type字段,表示(广义)连接类型,它描述了找到所需数据使用的扫描方式;

(2)常见的扫描类型有:

system>const>eq_ref>ref>range>index>ALL

其扫描速度由快到慢;

(3)各类扫描类型的要点是:

  • system最快:不进行磁盘IO

  • const:PK或者unique上的等值查询

  • eq_ref:PK或者unique上的join查询,等值匹配,对于前表的每一行(row),后表只有一行命中

  • ref:非唯一索引,等值匹配,可能有多行命中

  • range:索引上的范围扫描,例如:between/in/>

  • index:索引上的全集扫描,例如:InnoDB的count

  • ALL最慢:全表扫描(full table scan)

(4)建立正确的索引(index),非常重要;

(5)使用explain了解并优化执行计划,非常重要;

posted on 2019-05-29 17:02  一天的PHP之路  阅读(119)  评论(0)    收藏  举报