Tag Archives: Mysql

mysql执行计划中extra列的内容说明

对mysql执行计划中extra列中部分常见内容含义总结如下: using index: 使用了索引覆盖,仅通过索引能获取select所需的数据 using index & using where:使用了索引覆盖,但因为有where语句,返回结果进行了进一步的过滤 using index condition:mysql 5.6之后的ICP(Index Condition Pushdown)特性,使用了索引,并回表查询,但where条件可以通过存储引擎过滤,一般情况是where中字段包含使用的索引字段中 using where:表示使用了where语句的过滤条件,和是否使用索引没有直接关系

[转]Mysql中模拟递归查询

众所周知,目前的mysql版本中并不支持直接的递归查询,但是通过递归到迭代转化的思路,还是可以在一句SQL内实现树的递归查询的。这个得益于Mysql允许在SQL语句内使用@变量。以下是示例代码。 创建表格 插入测试数据 查询语句

Mysql的行锁只锁一行记录吗?

InnoDB行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的。 InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁,会把所有扫描过的行都锁定! 在实际应用中,要特别注意InnoDB行锁的这一特性,不然的话,可能导致大量的锁冲突,从而影响并发性能。 由于MySQL的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但是如果是使用相同的索引键,是会出现锁冲突的。 当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁; 另外间隙锁也会锁多行,InnoDB除了通过范围条件加锁时使用间隙锁外,如果使用相等条件请求给一个不存在的记录加锁,InnoDB也会使用间隙锁! 当发生死锁的时候,Innodb目前处理死锁的方法是将持有最少行级排他锁的事务进行回滚。 查看INNODB中可能存在的死锁情况: SHOW ENGINE INNODB STATUS

在Mysql中模拟ROW_NUMBER, RANK, DENSE_RANK

从MariaDB 10.2.0版本,开始支持window类函数,但现在还不是正式版本,不建议在生产环境使用。 可以使用下面的sql语句,模拟ROW_NUMBER, RANK, DENSE_RANK函数的功能。这种写法不需要做表的自连接,性能会比较好。