mysql 易错笔记

  1. 数据库隔离级别:
    Read-Uncommitted
    Read-Committed
    Repeatable-Read
    Seriaizable
-- 全局级别
SHOW GLOBAL VARIABLES like 'transaction_isolation';
-- 回话级别
SHOW SESSION VARIABLES like 'transaction_isolation';
-- 设置全局级别为RR
SET GLOBAL  transaction_isolation='REPEATABLE-READ';
-- 设置回话级别为RR
SET SESSION transaction_isolation='REPEATABLE-READ';
  1. 在隔离级别为RR下,如果update中的where没有使用到索引,则会给扫描到的所有行加上锁(锁表),其余的更新必须等待表释放后才能操作;在RC下,如果没使用到索引,则会对当前记录加锁,不会加表锁;
  2. 覆盖索引特殊情况,如果select中满足覆盖索引,并且where中的字段也属于覆盖索引中的字段, 则会都会覆盖索引,即使where中出现范围查询或不满足最左匹配都是。
    例如:
    KEY dx_nam (name(4),parent_id,code) USING BTREE;
    下面这些都能走到索引:
SELECT `code`,parent_id FROM test.test WHERE    `CODE` ='3' and `name`='44' and  parent_id>51;
SELECT `code`,parent_id,id FROM test.test WHERE  parent_id>51;
SELECT `code`,parent_id,id FROM test.test WHERE  code like '%43%';
SELECT `code`,parent_id,id FROM test.test WHERE  name = '5543';
SELECT `code`,parent_id,id FROM test.test WHERE  name like '5543%';

这个不走:

SELECT `code`,parent_id,id FROM test.test WHERE  name like '%5543%';

mysql 易错笔记_第1张图片

  1. mysql 用触发器创建一个check约束.
    custom_table表中的phone字段添加是否为encrypt开头
DELIMITER $$
CREATE PROCEDURE `check_encrypt`(IN encString VARCHAR(100))
BEGIN
    IF  LEFT(encString,7) <>'encrypt' THEN
        SIGNAL SQLSTATE '45000'
            SET MESSAGE_TEXT = 'characters need to be encrypted';
    END IF;
END$$
DELIMITER ;;

CREATE TRIGGER `check_insert_phone` BEFORE INSERT ON `custom_table` FOR EACH ROW CALL check_encrypt(new.phone);

CREATE TRIGGER `check_update_phone` BEFORE UPDATE ON `custom_table` FOR EACH ROW CALL check_encrypt(new.phone);
  1. where条件对 二级索引来进行函数变化后进行统计,会走到索引.
    例如: 下面的语句会用到索引
    KEY idx_create_at(create_at)
 select count(*) from temp_table where month(create_at)=2;
  1. 模糊右like 其实是看cost(成本)来觉得是否走索引的,并不是一定会走索引
    例如:
    KEY idx_name(name)
 select * from temp_table where name like 'xx%';-- 可能不走索引
 select * from temp_table where name like 'xxgeagwg%';-- 可能走索引
  1. 当索引的类型不匹配时,会转换成相同类型来进行匹配,如果是字符串整型进行比较,会将字符串转换成整型来比较。
    例如:
CREATE TABLE `temp_table` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `type` varchar(10) NOT NULL DEFAULT '' COMMENT '类型:"0","2","3"',
  PRIMARY KEY (`id`),
  KEY `idx_type` (`type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='表';
select * from temp_table where `type`=2; -- 没用到索引
select * from temp_table where id='34'; -- 用到索引

你可能感兴趣的:(mysql,java,java,sql,linux)