<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: TAPAS MAHATA</title>
    <description>The latest articles on DEV Community by TAPAS MAHATA (@tapas_mahata).</description>
    <link>https://dev.to/tapas_mahata</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4112912%2Ff3f0ba91-c362-4fe4-8f29-fc460616229d.jpg</url>
      <title>DEV Community: TAPAS MAHATA</title>
      <link>https://dev.to/tapas_mahata</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tapas_mahata"/>
    <language>en</language>
    <item>
      <title>10 MySQL Performance Optimization Techniques Every PHP Developer Must Know</title>
      <dc:creator>TAPAS MAHATA</dc:creator>
      <pubDate>Tue, 08 Sep 2026 09:10:36 +0000</pubDate>
      <link>https://dev.to/tapas_mahata/10-mysql-performance-optimization-techniques-every-php-developer-must-know-2ifp</link>
      <guid>https://dev.to/tapas_mahata/10-mysql-performance-optimization-techniques-every-php-developer-must-know-2ifp</guid>
      <description>&lt;p&gt;Slow MySQL queries can cripple your web application. This guide covers indexing, query optimization, table design, and caching techniques to make your database run 10x faster.&lt;br&gt;
10 MySQL Performance Optimization Techniques Every PHP Developer Must Know&lt;/p&gt;

&lt;h2&gt;
  
  
  A slow database query can make your entire PHP application feel sluggish. Even a 500ms query running 100 times per page load adds 50 seconds of wait time. I've compiled the 10 most effective MySQL optimization techniques that have helped me speed up real projects.
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Use Indexes Properly
Indexes are the single most important optimization. Add indexes to columns used in WHERE, JOIN, and ORDER BY:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Check existing indexes&lt;/span&gt;
&lt;span class="k"&gt;SHOW&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Add index to frequently searched column&lt;/span&gt;
&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="k"&gt;ADD&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_email&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Composite index for multiple columns&lt;/span&gt;
&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="k"&gt;ADD&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_user_date&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;EXPLAIN Your Queries
Always use EXPLAIN to understand how MySQL executes your query:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;EXPLAIN&lt;/span&gt; &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'pending'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Look for:&lt;br&gt;
&lt;code&gt;type=ALL&lt;/code&gt; → full table scan (BAD)&lt;br&gt;
&lt;code&gt;type=ref&lt;/code&gt; or &lt;code&gt;type=range&lt;/code&gt; → index used (GOOD)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Select Only What You Need
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// BAD - fetches all columns&lt;/span&gt;
&lt;span class="nv"&gt;$users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$db&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"SELECT * FROM users WHERE active = 1"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;fetchAll&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// GOOD - fetch only needed columns&lt;/span&gt;
&lt;span class="nv"&gt;$users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$db&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"SELECT id, name, email FROM users WHERE active = 1"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;fetchAll&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Solve the N+1 Query Problem
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// BAD: N+1 queries&lt;/span&gt;
&lt;span class="nv"&gt;$users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$db&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"SELECT * FROM users"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;fetchAll&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$users&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$db&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"SELECT * FROM posts WHERE user_id = &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;fetchAll&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// GOOD: Single JOIN query&lt;/span&gt;
&lt;span class="nv"&gt;$results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$db&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"
    SELECT u.id, u.name, p.title
    FROM users u
    LEFT JOIN posts p ON p.user_id = u.id
"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;fetchAll&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Always Paginate Large Results
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Page 1 (20 results)&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;category_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="k"&gt;OFFSET&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- For very large tables, use cursor pagination&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;last_id&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="k"&gt;ASC&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Avoid Functions on Indexed Columns
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- BAD: function prevents index usage&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="nb"&gt;YEAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- GOOD: range query uses index&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="s1"&gt;'2026-01-01'&lt;/span&gt;
&lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="s1"&gt;'2027-01-01'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Use Proper Data Types
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="nb"&gt;UNSIGNED&lt;/span&gt; &lt;span class="n"&gt;AUTO_INCREMENT&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="nb"&gt;DECIMAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;-- not FLOAT for money&lt;/span&gt;
  &lt;span class="n"&gt;is_active&lt;/span&gt; &lt;span class="nb"&gt;TINYINT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;-- not VARCHAR for booleans&lt;/span&gt;
  &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;                 &lt;span class="c1"&gt;-- only TEXT when needed&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Optimize JOINs
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Ensure JOIN columns are indexed&lt;/span&gt;
&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="k"&gt;ADD&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_customer_id&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Prefer INNER JOIN over LEFT JOIN when possible&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;
&lt;span class="k"&gt;INNER&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'pending'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Cache Query Results in PHP
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getCachedQuery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$db&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$sql&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="nv"&gt;$ttl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$cacheFile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;sys_get_temp_dir&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'/db_'&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nb"&gt;md5&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'.cache'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;file_exists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$cacheFile&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nb"&gt;filemtime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$cacheFile&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nv"&gt;$ttl&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;unserialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;file_get_contents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$cacheFile&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nv"&gt;$stmt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$db&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;prepare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$sql&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$stmt&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$params&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$stmt&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;fetchAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;PDO&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;FETCH_ASSOC&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nb"&gt;file_put_contents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$cacheFile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;serialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$result&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Monitor Slow Queries
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Enable slow query log&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="k"&gt;GLOBAL&lt;/span&gt; &lt;span class="n"&gt;slow_query_log&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'ON'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="k"&gt;GLOBAL&lt;/span&gt; &lt;span class="n"&gt;long_query_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="k"&gt;GLOBAL&lt;/span&gt; &lt;span class="n"&gt;slow_query_log_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'/var/log/mysql/slow.log'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Quick Checklist&lt;br&gt;
[ ] Add indexes to WHERE, JOIN, ORDER BY columns&lt;br&gt;
[ ] Run EXPLAIN on slow queries&lt;br&gt;
[ ] Replace SELECT * with specific columns&lt;br&gt;
[ ] Fix N+1 queries with JOINs&lt;br&gt;
[ ] Add LIMIT to all queries&lt;br&gt;
[ ] Use range queries instead of functions on indexed columns&lt;br&gt;
[ ] Use correct data types&lt;br&gt;
[ ] Cache repeated queries&lt;/p&gt;

&lt;h2&gt;
  
  
  [ ] Monitor slow query log
&lt;/h2&gt;

&lt;p&gt;I've also published detailed guides on Web Security, REST API with PHP, CSS Flexbox, and JavaScript Async/Await on my dev tools site.&lt;br&gt;
Check out the free SQL Formatter tool at tsmtools.in/devtools.html — useful for cleaning up complex queries before running them.&lt;br&gt;
What's your biggest MySQL performance challenge? Drop a comment below! 👇&lt;/p&gt;

</description>
      <category>php</category>
      <category>mysql</category>
      <category>webdev</category>
      <category>sql</category>
    </item>
    <item>
      <title>I Built 93+ Free Browser-Based Tools for Developers — No Signup, No Upload</title>
      <dc:creator>TAPAS MAHATA</dc:creator>
      <pubDate>Sun, 06 Sep 2026 23:59:34 +0000</pubDate>
      <link>https://dev.to/tapas_mahata/i-built-93-free-browser-based-tools-for-developers-no-signup-no-upload-54g7</link>
      <guid>https://dev.to/tapas_mahata/i-built-93-free-browser-based-tools-for-developers-no-signup-no-upload-54g7</guid>
      <description>&lt;h1&gt;
  
  
  I Built 93+ Free Browser-Based Tools for Developers — No Signup, No Upload
&lt;/h1&gt;

&lt;p&gt;I'm a teacher and self-taught web developer from India. Over the past few months, I built &lt;strong&gt;&lt;a href="https://tsmtools.in" rel="noopener noreferrer"&gt;TSM Tools&lt;/a&gt;&lt;/strong&gt; — a completely free, browser-based toolkit with 93+ tools for developers, SEO professionals, and students.&lt;/p&gt;

&lt;p&gt;No backend. No database. No signup. Everything runs 100% in your browser — your files and data never leave your device.&lt;/p&gt;

&lt;p&gt;Here's what I built and why.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤔 Why I Built This
&lt;/h2&gt;

&lt;p&gt;I was tired of switching between 10 different websites just to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Format a JSON response&lt;/li&gt;
&lt;li&gt;Check keyword density of a blog post&lt;/li&gt;
&lt;li&gt;Generate a QR code&lt;/li&gt;
&lt;li&gt;Calculate an EMI&lt;/li&gt;
&lt;li&gt;Decode a JWT token&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most of these tools either require signup, show aggressive ads, or upload your files to their server. I wanted something &lt;strong&gt;fast, private, and free&lt;/strong&gt; — so I built it myself.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠 What's Inside
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Developer Tools (24 tools)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;JSON Formatter &amp;amp; Validator&lt;/strong&gt; — beautify or minify JSON instantly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JS / CSS / HTML Formatter&lt;/strong&gt; — format messy code in one click&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JS / CSS Minifier&lt;/strong&gt; — reduce file size for production&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JWT Decoder&lt;/strong&gt; — inspect tokens without any library&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;.htaccess Generator&lt;/strong&gt; — build Apache redirect rules visually&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cron Expression Builder&lt;/strong&gt; — create cron schedules with plain-English preview&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Base Converter&lt;/strong&gt; — Binary ↔ Decimal ↔ Hex ↔ Octal&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SQL Formatter&lt;/strong&gt; — format raw SQL queries&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regex Tester&lt;/strong&gt; — test regular expressions with live matches&lt;/li&gt;
&lt;li&gt;And more...&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔄 Converters (26 tools)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Excel Viewer&lt;/strong&gt; — open .xlsx, .xls, .ods with multi-sheet support&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Excel → JSON / CSV / HTML&lt;/strong&gt; — export spreadsheet data instantly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CSV → Excel / JSON → Excel&lt;/strong&gt; — download as .xlsx in one click&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JSON ↔ CSV ↔ XML&lt;/strong&gt; — convert data formats instantly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Image Compressor&lt;/strong&gt; — reduce file size with quality slider&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Image Resizer&lt;/strong&gt; — custom dimensions with aspect ratio lock&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format Converter&lt;/strong&gt; — PNG ↔ JPEG ↔ WebP&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PDF to HTML&lt;/strong&gt; — each page rendered as image, exact visual copy&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Word to HTML&lt;/strong&gt; — convert .docx to HTML markup&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Markdown ↔ HTML&lt;/strong&gt; — live preview conversion&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Text ↔ Binary / Hex / Morse Code&lt;/strong&gt; — encode and decode instantly&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ⚡ Utilities (21 tools)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;EMI Calculator&lt;/strong&gt; — home, car, personal loans with tenure quick-select&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BMI Calculator&lt;/strong&gt; — metric and imperial with health range&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Age Calculator&lt;/strong&gt; — exact age with next birthday countdown&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;QR Code Generator&lt;/strong&gt; — URL, text, contact info&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Invoice Generator&lt;/strong&gt; — create and print professional invoices&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unit Converter&lt;/strong&gt; — length, weight, temperature, speed, area, data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Password Generator&lt;/strong&gt; — with strength indicator&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IP Address Lookup&lt;/strong&gt; — detect your current IP instantly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Color Picker&lt;/strong&gt; — HEX, RGB, HSL values&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Word Counter&lt;/strong&gt; — characters, sentences, reading time&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📈 SEO Tools (21 tools)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SERP Preview&lt;/strong&gt; — see how your page looks in Google search&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keyword Density Checker&lt;/strong&gt; — analyze keyword usage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Meta Tag Generator&lt;/strong&gt; — create optimized title and description&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sitemap Generator&lt;/strong&gt; — create XML sitemaps for Google Search Console&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Schema Markup Generator&lt;/strong&gt; — JSON-LD structured data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Twitter Card Preview&lt;/strong&gt; — see how links look when shared&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTTP Header Checker&lt;/strong&gt; — inspect response headers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Core Web Vitals Guide&lt;/strong&gt; — LCP, FID, CLS explained&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔬 PHP/JS/HTML Health Checker
&lt;/h3&gt;

&lt;p&gt;This is the tool I'm most proud of. Upload a ZIP file of your PHP, JavaScript, or HTML project and get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SQL injection vulnerability detection&lt;/li&gt;
&lt;li&gt;XSS vulnerability scanning&lt;/li&gt;
&lt;li&gt;JavaScript syntax checking&lt;/li&gt;
&lt;li&gt;Security best practice analysis&lt;/li&gt;
&lt;li&gt;Auto-fix suggestions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All scanning happens in your browser using JavaScript — your code is never uploaded to any server.&lt;/p&gt;




&lt;h2&gt;
  
  
  🏗 How I Built It
&lt;/h2&gt;

&lt;p&gt;Everything is vanilla HTML, CSS, and JavaScript — no frameworks, no build tools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key libraries used:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://sheetjs.com/" rel="noopener noreferrer"&gt;SheetJS (xlsx)&lt;/a&gt; — Excel file reading and writing&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/mwilliamson/mammoth.js" rel="noopener noreferrer"&gt;Mammoth.js&lt;/a&gt; — Word to HTML conversion&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://mozilla.github.io/pdf.js/" rel="noopener noreferrer"&gt;PDF.js&lt;/a&gt; — PDF rendering on canvas&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://davidshimjs.github.io/qrcodejs/" rel="noopener noreferrer"&gt;QRCode.js&lt;/a&gt; — QR code generation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What I learned:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Browser APIs are incredibly powerful — File API, Canvas API, Blob API, URL.createObjectURL()&lt;/li&gt;
&lt;li&gt;You can do a lot without a backend if you design around client-side processing&lt;/li&gt;
&lt;li&gt;Keeping everything in one HTML file per page makes deployment trivially simple&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📊 The Numbers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Tools&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Dev Tools&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Converters&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Utils&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SEO Tools&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Health Checker&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;93+&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blog Articles&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🚀 What's Next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;More Excel tools (pivot table viewer, formula helper)&lt;/li&gt;
&lt;li&gt;More SEO tools (backlink checker, page speed analyzer)&lt;/li&gt;
&lt;li&gt;Dark mode&lt;/li&gt;
&lt;li&gt;Mobile app (PWA)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔗 Try It
&lt;/h2&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://tsmtools.in" rel="noopener noreferrer"&gt;https://tsmtools.in&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;All tools are free, forever. No signup. No upload. No tracking beyond basic analytics.&lt;/p&gt;

&lt;p&gt;I'd love to hear your feedback — what tools do you use most? What's missing? Drop a comment below! 👇&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with ❤️ by a teacher who codes.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>php</category>
      <category>tools</category>
    </item>
  </channel>
</rss>
