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