- 数据库隔离级别:
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';
- 在隔离级别为RR下,如果update中的where没有使用到索引,则会给扫描到的所有行加上锁(锁表),其余的更新必须等待表释放后才能操作;在RC下,如果没使用到索引,则会对当前记录加锁,不会加表锁;
- 覆盖索引特殊情况,如果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 用触发器创建一个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);
- where条件对 二级索引来进行函数变化后进行统计,会走到索引.
例如: 下面的语句会用到索引
KEY idx_create_at(create_at)
select count(*) from temp_table where month(create_at)=2;
- 模糊右
like
其实是看cost(成本)来觉得是否走索引的,并不是一定会走索引
例如:
KEY idx_name(name)
select * from temp_table where name like 'xx%';-- 可能不走索引
select * from temp_table where name like 'xxgeagwg%';-- 可能走索引
- 当索引的类型不匹配时,会转换成相同类型来进行匹配,如果是
字符串
和整型
进行比较,会将字符串转换成整型来比较。
例如:
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'; -- 用到索引