mysql 优化表_mysql里sql优化和表结构优化
開啟慢查詢?nèi)罩?計(jì)入sql
show variables like 'slow_query_log';//慢查詢查看狀態(tài) OFF未開啟 ON開啟
show variables like '%log%';//沒有使用索引的sql計(jì)入慢查詢?nèi)罩局?/p>
set global log_queries_nor_using_indexes = on;
//開啟log_queries_nor_using_indexes 為ON 記錄未使用索引的查詢
show variables like 'long_query_time';
//超過多少時(shí)間就記錄到慢查詢中
//開啟慢查詢
set global slow_query_log = on;
//慢查詢?nèi)罩镜奈恢?/p>
show variables like 'slow%';
left join :eft join是以A表的記錄為基礎(chǔ)的,A可以看成左表,B可以看成右表,left join是以左表為準(zhǔn)的.
換句話說,左表(A)的記錄將會(huì)全部表示出來,而右表(B)只會(huì)顯示符合搜索條件的記錄(例子中為: A.aID = B.bID).
right join:和left join的結(jié)果剛好相反,這次是以右表(B)為基礎(chǔ)的,A表不足的地方用NULL填充.
inner join:這里只顯示出了 A.aID = B.bID的記錄.這說明inner join并不以誰為基礎(chǔ),它只顯示符合條件的記錄.
sql索引優(yōu)化
explain select 字段 from 表名 ;
table 代表當(dāng)前表
type 顯示類型 重要列 !性能最好到最壞排序 const(主鍵唯一索引查找),eq_reg(范圍查找),ref(一個(gè)表基于一個(gè)索引查找),range(基于索引范圍查找),index(對(duì)索引的掃描),all(表掃描)
possible_keys 當(dāng)前表可用到的索引有哪些,如果為null就是沒有可能的索引
key 實(shí)際使用的索引,為null就是沒有可能的索引
key_len 使用索引的長(zhǎng)度 越小越好
ref 顯示索引的哪一列被使用
rows mysql必須檢查用來返回請(qǐng)求的數(shù)據(jù)行數(shù)
extra 返回值
using filesort:查詢需要優(yōu)化,mysql需要進(jìn)行額外步驟,文件排序進(jìn)行優(yōu)化
using temporary :查詢需要優(yōu)化,mysql需要?jiǎng)?chuàng)建一個(gè)臨時(shí)表來存儲(chǔ)結(jié)果
sql優(yōu)化例子 *
Where查詢條件,on內(nèi)外連接時(shí)候用,as作為別名,in查詢某值是否在某條件里
max優(yōu)化方法:查找最大的 最后的
select max(字段data) from 表;
優(yōu)化方法:在data上建立索引
create index idx_data on 表(字段data) ;
count優(yōu)化方法:全部
查找2006-2007的數(shù)量全部的數(shù)量
優(yōu)化方法:
select count(year='2006' or year='2007') from 表;
查找2006-2007的分開的數(shù)量
優(yōu)化方法:
select count(year='2006' or null),count(year='2007' or null) from 表;
子查詢優(yōu)化:
select * from t where t.id in (select t1.tid from t1);
優(yōu)化方法: 需要把子查詢優(yōu)化為join查詢 join on 后邊的條件只針對(duì)附表
select t.id from t jion t1 on t.id = t1.tid;
去重distinct
select distinct t.id from t jion t1 on t.id = t1.tid;
group by查詢
select actor.first_name,actor.last_name, count(*) from filem_actor inner actor using(actor_id) group by filem_actor.actor_id;
優(yōu)化后group by查詢
select actor.first_name,actor.last_name,c.cnt from actor inner join (select actor_id,count(*)as cnt from film_actor group by actor_id ) as c using(actor_id);
limit優(yōu)化方法:
select film_id,dd from film order by title limit 600,5;//從第600行開始的5條記錄
優(yōu)化后
select film_id,dd from film where film_id >600 and film_id <=605 oder by film_id limit 1,5;
索引優(yōu)化例子:
1在where從句,group by從句,order by從句,on從句中出現(xiàn)的列
2索引字段越小越好
3離散度大的列放到聯(lián)合索引前面
優(yōu)化查詢效率,對(duì)插入 修改 刪除語句有影響
索引越多查詢?cè)铰?/p>
如何找到重復(fù)索引
列子:
id primay key主鍵索引 unique(id)又生成一個(gè)唯一索引 這就重復(fù)索引!
如何找到zongyu索引
多個(gè)索引的前綴列是相同的
id primay key主鍵索引 又生成一個(gè)key(name,id)聯(lián)合索引!
表結(jié)構(gòu)優(yōu)化
如何選擇合適的數(shù)據(jù)類型:
1.可以存下數(shù)據(jù)的最小的數(shù)據(jù)類型
2.使用簡(jiǎn)單的數(shù)據(jù)類型。 int比varchar在mysql處理上簡(jiǎn)單
3.盡可能的使用not null定義字段
4.盡量少于text類型,非用時(shí)考慮分表
范式化優(yōu)化
數(shù)據(jù)表結(jié)構(gòu)
傳遞函數(shù)依賴關(guān)系 商品名稱-》分類-》分類描述
商品名稱 價(jià)格 重量 有效期 分類 分類描述
把一張表分成3張表1商品表商品名稱 價(jià)格 重量 有效期2分類表 分類 分類描述3關(guān)系表 **
商品名稱 分類
反范式化優(yōu)化
操作前:
用戶表:
用戶id 姓名 電話 地址 郵編
訂單表:
訂單id 用戶id 下單時(shí)間 支付類型 訂單狀態(tài)
訂單商品表:
訂單id 商品id 商品數(shù)量 商品價(jià)格
商品表:
商品id 名稱 描述 過期時(shí)間
操作后:
用戶表:
用戶id 姓名 電話 地址 郵編
訂單表:合并一個(gè)表中查詢
訂單id 用戶id 下單時(shí)間 支付類型 訂單狀態(tài) 訂單價(jià)格 用戶名 電話 地址
訂單商品表:
訂單id 商品id 商品數(shù)量 商品價(jià)格
商品表:
商品id 名稱 描述 過期時(shí)間
執(zhí)行sql查詢訂單信息:
select a.用戶名,a.電話,a.地址,a.訂單id,a.訂單價(jià)格 from 訂單表 a
表的垂直拆分:
例:
id
title varvhar
description text
..字段
如果表中有包含 title和description text數(shù)據(jù)類型的話,拆分出去
用拆分后的付加表中的表id關(guān)聯(lián)拆分前的表id
付加表:
id
title varvhar
description text
表的水平拆分:
解決表單的數(shù)據(jù)量過大
系統(tǒng)優(yōu)化:
1操作系統(tǒng)的優(yōu)化 2mysql系統(tǒng)本身優(yōu)化
mysql服務(wù)器上關(guān)閉iptables,selinux等防火墻軟件
mysql優(yōu)化:
linux下mysql配置文件位置 /etc/my.cnf 或者 /etc/mysql/my.cnf
windows下mysql配置文件位置 c:/ windows/my.ini文件
服務(wù)器硬件優(yōu)化
mysql一些工作只能用到單核cpu的
選擇單核頻率更快的cpu
總結(jié)
以上是生活随笔為你收集整理的mysql 优化表_mysql里sql优化和表结构优化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: kprcycleaner.exe是什么
- 下一篇: linux cmake编译源码,linu