mysql笔记

178 阅读2分钟

GROUP_CONCAT 函数连接Id的时候,返回的是Blob类型

由于mysql版本是5.5以下的,所以使用GROUP_CONCAT 函数连接Id的时候,返回的是Blob类型,解决办法:

CONVERT (
		GROUP_CONCAT(zcmr.column_manager_name) USING utf8
	) AS column_manager_name,
    
CAST(
		GROUP_CONCAT(zcmr.column_manger_code) AS CHAR
	) AS column_manger_code
    
GROUP_CONCAT(
		CAST((zcmr.column_manger_code) AS CHAR
        )
	) AS column_manger_code

like子句尽量使用前端匹配

EXPLAIN SELECT USER_CODE,USER_NAME FROM zk_user WHERE USER_CODE LIKE '00270170%'
EXPLAIN SELECT USER_CODE,USER_NAME FROM zk_user WHERE USER_CODE LIKE '%00270170%'

WHERE子句中不能含有OR

EXPLAIN 
SELECT USER_CODE,USER_NAME FROM zk_user WHERE USER_CODE = '0027017021'  
UNION ALL
SELECT USER_CODE,USER_NAME FROM zk_user WHERE USER_CODE = '0027017051'

EXPLAIN 
SELECT USER_CODE,USER_NAME FROM zk_user WHERE  USER_CODE = '0027017021'  OR USER_CODE = '0027017051'  

explain执行计划字段含义

type

  • 访问类型,即 MySQL 决定如何查找表中的行。

  • 依次从好到差:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL,除了 all 之外,其他的 type 都可以使用到索引,除了 index_merge 之外,其他的 type 只可以用到一个索引。一般来说,得保证查询至少达到 range 级别,最好能达到 ref。

filtered

  • 使用 explain extended 时会出现这个列,5.7 之后的版本默认就有这个字段,不需要使用 explain extended 了。
  • 这个字段表示存储引擎返回的数据在 server 层过滤后,剩下多少满足查询的记录数量的比例,注意是百分比,不是具体记录数。

in和exists

select count(1) from orders o where o.user_id in(select u.id from users u);
select count(1) from orders o where exists (select 1 from users u where u.id = o.user_id);

in适合于外表大而内表小的情况,exists适合于外表小而内表大的情况。

优化ORDER BY语句

1.通过有序索引顺序扫描直接返回有序数据 因为索引的结构是B+树,索引中的数据是按照一定顺序进行排列的,所以在排序查询中如果能利用索引,就能避免额外的排序操作。EXPLAIN分析查询时,Extra显示为Using index。

2.Filesort排序,对返回的数据进行排序 所有不是通过索引直接返回排序结果的操作都是Filesort排序,也就是说进行了额外的排序操作。EXPLAIN分析查询时,Extra显示为Using filesort。

MySQL一次查询只能使用一个索引,如果要对多个字段使用索引,建立复合索引。