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一次查询只能使用一个索引,如果要对多个字段使用索引,建立复合索引。